无溢出下浮点数x/4与x/2/2、x*4与x*2*2是否恒相等?
浮点数除法与乘法的等价性疑问
已知对于浮点数x,x/n²可能不等于x/n/n——因为后者会先计算中间结果x/n,再进行第二次除法,浮点数的精度特性可能导致两次计算结果不一致。比如下面的JavaScript代码示例:
document.write(1.23456789/49 == 1.23456789/7/7);
但我好奇:在无溢出和下溢的情况下,x/4 == x/2/2是不是例外,始终成立?
我做了简单测试:
document.write(1.23456789/4 == 1.23456789/2/2);
从二进制角度分析这个测试用例:
- 1.23456789对应的实际float值是1.2345678806304931640625,二进制表示为:
0 01111111 00111100000011001010010 - 它除以2后的结果是0.61728394031524658203125,二进制表示为:
0 10000000 00111100000011001010010
可以看到,除以2的操作仅改变了浮点数的指数部分,尾数部分完全保持不变。
基于此我提出假设:在无溢出和下溢的前提下,所有浮点数x都满足x/4 == x/2/2,同时也满足x*4 == x*2*2。这个假设是否成立?
内容的提问来源于stack exchange,提问作者wcminipgasker2023
相关产品推荐
相关产品推荐

