Java浮点与整数保序的双射
Java中的int和float都是32位大小的值。是否可以对一对函数进行编程Java浮点与整数保序的双射,java,casting,int,Java,Casting,Int,Java中的int和float都是32位大小的值。是否可以对一对函数进行编程 int toInt(float f); float toFloat(int n); 如果f1和f2是任意浮点非NaN值,i1和i2是仲裁int值: f1toIntf2 f1==f2当且仅当toIntf1==toIntf2 toInttoFloati1==i1 toFloattoIntf1==f1 编辑:我对问题进行了编辑,以排除浮点值的NaN值,因为答案澄清了这些值会发生什么。是的。和double的排列方式使您可以通
int toInt(float f);
float toFloat(int n);
如果f1和f2是任意浮点非NaN值,i1和i2是仲裁int值:
f1f1 == f2
不可能,请参阅以了解更多信息。如果你真的想要近似相等检查,你需要包含一个delta。我明白你的意思。起初我对你的问题有不同的解释。正如其他人提到的:是的。使用描述的文章并解释为什么我们应该使用@Peter Lawrey描述的方法来比较整数和浮点之间的基本位模式
int n = Float.floatToRawIntBits(f);
float f2 = Float.intBitToFloat(n);
int n2 = Float.floatToRawIntBits(f2);
assert n == n2; // always
assert f == f2 || Float.isNaN(f);
作为int的原始位与原始浮点具有相同的排序顺序,但与浮点值不可比的NaN值除外,NaN值具有作为int的值
注意:NaN有多个值,它们作为浮点值彼此不相等
有2^32个可能的int值,它们都是不同的。
然而,你是少于2^32浮动;即7FF0000000000001至7FF7FFFFFFFFFFFF代表NaN的
因此,整数比浮点数多,并且不能清楚地将它们相互映射,因为toFloati1不能为每个整数生成一个不同的浮点数。鲁迪格·克莱恩的答案给出了正常情况,但缺少一些细节。双射只存在于nice和clean float的域中 注意:IEEE浮点的表示形式为符号1位指数8位SINIFIC和23位,在干净的情况下,值为:-1sign*2exp*有效位。事实上,23位代表实际有效位的小数部分,整数部分为1 对于0
所以,如果你想要一个双射只使用0