计算第N个浮点数。

7

使用32位浮点数,可以表示大约2^31-1个不同的浮点数。在Java中,您可以使用Math库获取现有浮点数并找到“下一个浮点数”。但是假设您没有起始浮点数,是否有一种方法可以计算第n个浮点数?如果有一个有库函数的语言,我就要它。

当然,我可以将所有浮点数放入数组中并索引到该数组中,但这会占用空间。

以下是更进一步的说明。我可以从Float.MIN开始,并使用nextFloat递增N次,但这似乎效率低下,因为我需要执行此操作多次。


2
在Java中,从Float.MIN_VALUE开始。 - Carl Manaster
它们必须按顺序吗?即float n+1> float n。你只是想将[0..2 ^ 31)映射到浮点数吗? - weston
@CarlManaster 这个方法可以工作,但你需要循环N次才能得到答案...我在尝试想一种将N与二进制表示连接起来的方法,但我不认为这是可能的。也许这就是最好的答案。 - evanmcdonnal
所以,如果你不在意使用什么语言,为什么不使用Java的nextUp或者你提到的其他函数呢?C和C++都没有提供这样的标准函数。你需要自己编写。 - dirkgently
浮点数可以有顺序,但这并不重要,我只需要一个包含所有浮点数的映射表,并且能够以O(1)的时间复杂度进行索引。但我不想将所有浮点数存储在数组中。我需要一个关于第N个浮点数的表达式或者某种计算方法来获取它。 - Justin Dennahower
显示剩余2条评论
1个回答

7

这取决于您想要它们如何排序。请注意,并非所有浮点数都进行了排序;例如,一对不同的NaN是无序的(即,它们不相等,但两者都不大于另一个)。

如果您不介意最终得到这些结果,可以将整数重新解释为浮点数。这种方法因语言而异;以下是C实现:

float int_to_float(uint32_t in) {
    union {
        float f;
        uint32_t i;
    } u;

    u.i = in;
    return u.f;
}

这具有方便的属性,它可以为您提供大多数有序的结果--传入零得到0.0,一个得到1.4e-45,2 得到2.8e-45,依此类推。一旦进入NaN / Inf值,结果将开始变得疯狂,并且一旦达到0x80000000(-0.0),结果将最终开始减少,但现在已经足够好了。

有没有一种方法可以从浮点数的位中检测NaN条件?或者这种方法总是会给出一个浮点值? - Justin Dennahower
1
当一个数字为NaN时,指数位被设置为0xFF(对于单精度浮点数)。http://en.wikipedia.org/wiki/Single-precision_floating-point_format - steveha
因此,您必须增加long时间才能达到NaN;您的浮点数的十六进制模式将为0x7F800000,或作为整数超过20亿。 - steveha
嗯,我认为无穷大也有 0xFF 指数位,但它们在技术上不是 NaN... - Louis Wasserman
正确。请参见https://en.wikipedia.org/wiki/Single-precision_floating-point_format#Exponent_encoding -- 无穷大是具有零尾数的FF指数,所有其他尾数均为NaN。 - user149341

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接