Java浮点与整数保序的双射

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的排列方式使您可以通

Java中的int和float都是32位大小的值。是否可以对一对函数进行编程

int toInt(float f);
float toFloat(int n);
如果f1和f2是任意浮点非NaN值,i1和i2是仲裁int值:

f1f2当且仅当toIntf1>toIntf2 f1==f2当且仅当toIntf1==toIntf2 toInttoFloati1==i1 toFloattoIntf1==f1 编辑:我对问题进行了编辑,以排除浮点值的NaN值,因为答案澄清了这些值会发生什么。

是的。和double的排列方式使您可以通过对原始二进制表示进行无符号比较来进行比较。将浮点转换为原始整数并返回的函数为和。这些函数是处理器内部函数,因此成本极低

长打和双打也是如此。这里的转换函数是和

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

此规则的唯一例外是NaN,它无论如何都不允许总排序

f1 == 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 对于exp==255,无限值为有效位==0,所有NaN为有效位!=0-好的,您明确地排除了它们

但是对于exp==0,仍然有一些奇怪的事情:当有效位==0时,就有+0和-0。我不确定他们是否被认为是平等的。如果有人知道,请随意编辑这篇文章。但作为整数值,它们当然会有所不同

当exp==0且有效位!=0如果您找到非规范化的数字。。。当不相等时,将转换为不为0的最小数字中的任何一个


所以,如果你想要一个双射只使用0