Java中精确表示的double乘除结果是否保证精确(不超±INF时)?
关于IEEE-754双精度浮点数乘法与除法的精确性问题
答案是否定的——不管是乘法还是除法,都没法保证运算结果一定能被double类型精确表示,哪怕输入的a和b本身是符合IEEE-754标准的精确值,且运算结果没有溢出到±INF。
乘法的反例
取两个能被double精确表示的整数:
double a = Math.pow(2, 52) + 1; // 2^52+1是精确值,2^53以内的整数都能被double精确存储 double b = 2.0;
两者相乘的结果是2^53 + 2,但double类型的尾数只有52位(加1位隐含位),最多能精确表示到2^53以内的连续整数,2^53 + 2无法被精确存储,运算后会得到一个近似值。
除法的反例
更直观的例子:
double a = 1.0; double b = 3.0;
a / b的结果是1/3,这个值在二进制中是无限循环的小数,不符合IEEE-754双精度浮点数的有限尾数存储规则,因此无法被精确表示,运算后返回的是近似值。
内容的提问来源于stack exchange,提问作者Gilgamesz
相关产品推荐
相关产品推荐

