Java浮点数和整数保持顺序之间的双射

Jos*_* D. 0 java int casting

intfloat在Java中都是32位的大小的值.是否可以编写一对函数

int toInt(float f);
float toFloat(int n);
Run Code Online (Sandbox Code Playgroud)

如果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值,这要归功于解释这些问题的答案.

Rüd*_*ehn 7

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

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

请注意,如果要对整数使用常规的有符号比较,除了转换为整数之外,还必须进行一些额外的转换.

这个规则的唯一例外是NaN,它不允许总排序.