迭代所有可能的浮点值

时间:2010-04-21 09:05:23

标签: floating-point bit-manipulation

如何列出浮点数据类型的所有可能值?我可以使用C或C ++中的union来做到这一点,但是它是可移植的吗?

如何在其他语言中完成?的Javascript?

我们假设我正在使用此迭代将theta映射到sin(theta)

5 个答案:

答案 0 :(得分:5)

查看nextafter()和nextafterf()的手册页。它们允许您从浮点数前进到下一个最接近的点数。您可以使用其中一个按顺序访问每个FP编号。

答案 1 :(得分:2)

  

如何列出所有可能的值   浮点数据类型?

通过对浮点值的IEEE-754 representation进行比特调整,对于浮点数,您需要2 ^ 32个不同的表示,假设每个浮点数4个字节需要16GB的内存。

我假设您需要一个正弦函数的查找表,只需按照您所需的精度从0到2 * PI循环。

答案 2 :(得分:1)

联合方法不太便于携带。这取决于您使用的任何类型的大小。 (如果sizeof(your_fp_type)> sizeof(your_int_type),则即使您有时间,也无法在整个范围内进行迭代。)

无论哪种方式,都要意识到可能的浮点值不是均匀分布在您选择的任何类型的范围内。当您离开0时,值之间的差异变得更大。考虑到这一点,以及生成这样一个列表所需的时间,以及您甚至没有足够的HD空间来表示每个可能的双倍的事实(我保证你没有!),更不用说RAM ......我不得不质疑创建这样一个列表的价值。查找该值所需的时间比进行计算要长。

答案 3 :(得分:0)

我无法想到一种可移植的方式来做到这一点。但是给定64位表示(标准IEEE双精度)并假设生成一个值需要1纳秒,生成所有可能值需要500多年。所以你有足够的时间来考虑算法:) ...

答案 4 :(得分:0)

除了nextafter()之外,还有ldexp() and frexp()用于明确处理尾数和指数。