我使用双打来统一实现某些算术运算。这些计算实际上也可以应用于整数,但Java中没有类似C ++的模板,我不想复制实现代码,因此我只是使用“double”版本进行整数。
当操作被模拟为相应的浮点运算时,JVM规范是否保证整数运算的正确性,如< =,> =,+, - ,*和/(在余数== 0的情况下)?
(当然,任何整数都有合理的大小,以双尾数表示)
答案 0 :(得分:2)
根据Java Language Specification:
浮点数上的运算符 表现符合IEEE 754(带有 其余的例外 运算符(第15.17.3节)。
所以你保证了统一的行为,虽然我无法访问官方的IEEE标准文档,但我很确定它隐含地保证对整数的操作可以完全表示为float / double工作正如所料。
答案 1 :(得分:1)
简要说明。
double a = 3.0;
double b = 2.0;
System.out.println(a*b); // 6.0
System.out.println(a+b); // 5.0
System.out.println(a-b); // 1.0
System.out.println(a/b); // 1.5 // if you want to get 1 here you should cast it to `integer (int)`
System.out.println(a>=b); // true
System.out.println(a<=b); // false
但乘法(*)时要小心,因为 a * b 会在转换为整数时导致溢出。 (+和 - )
的情况相同答案 2 :(得分:1)
确实,我已经找到了标准并且说“是”
JVM规范:
Java虚拟机的舍入操作始终使用IEEE 754 round 最近的模式。不精确的结果四舍五入到最接近的可表示值,并且关系将转到具有零最低有效位的值。这是IEEE 754默认模式。但是,将浮点类型的值转换为整数类型值的Java虚拟机指令向零舍入。 Java虚拟机没有提供任何改变浮点舍入模式的方法。
ANSI / IEEE标准754-1985 5. ...除了二进制&lt; ---&gt;十进制转换,每个操作都应该执行,好像它首先产生一个正确到无限精度和无限范围的中间结果,然后强制这个中间结果以适应目的地的格式
ANSI / IEEE标准754-1985 5.4。 除非出现7.1中规定的例外情况,否则浮点整数和整数格式之间的转换应该是准确的。
摘要
1)如果结果符合double格式,则精确的操作总是精确的(因此,整数结果总是浮点整数)。
2)int&lt; - &gt;对于浮点整数,双转换总是精确的。