Java中的intfloat均为32位大小值。是否可以编写一对功能

int toInt(float f);
float toFloat(int n);


这样,如果f1f2是任意的float非NaN值,而i1和i2是任意的int值:


f1 < f2当且仅当toInt(f1) < toInt(f2)
f1 > f2当且仅当toInt(f1) > toInt(f2)
f1 == f2当且仅当toInt(f1) == toInt(f2)
toInt(toFloat(i1) == i1
toFloat(toInt(f1)) == f1


编辑:我已经编辑了问题,以排除浮点数的NaN值,这要归功于答案,这些问题阐明了这些问题。

最佳答案

是。 IEEE floats和双精度字的排列方式使您可以通过对原始二进制表示形式进行无符号比较来对其进行比较。从float转换为原始整数然后返回的函数是java.lang.Float.floatToIntBitsjava.lang.Float.intBitsToFloat。这些功能是处理器的内在功能,因此成本极低。

多头和双打也是如此。这里的转换函数是java.lang.Double.doubleToLongBitsjava.lang.Double.longBitsToDouble

请注意,如果要对整数使用常规的带符号比较,则除了转换为整数外,还必须执行一些其他转换。

NaN是该规则的唯一例外,它无论如何都不允许总订购。

10-08 10:50