我正在查看一些代码,发现一些部分使用 num/2,而其他部分使用 num * 0.5。这启发了我一个问题:在 MIN_VALUE 和 MAX_VALUE 的范围内,num/2 和 num*0.5 可以互换吗?
我不仅对 num 除以 2 的情况感兴趣,请考虑:
0.5 = 1/2
4 = 1/0.25
0.125 = 1/8
which y=1/x and both x any y 可以用浮点数完美表示。我的问题是,对于 x , y 可以用浮点数完美表示而无需四舍五入的其他情况,以及 Float.MIN_VALUE<=x,y,z,z*y<=Float.MAX_VALUE, is z * y == z/x always true?
我测试了一些案例,这是真的:
document.write(123.456*4 == 123.456/0.25);
document.write("<br/>");
document.write(24.68/16 == 24.68*0.0625);
document.write("<br/>");
document.write(98.765/2 == 98.765*0.5);
我也尝试通过for-loop来验证一些案例:
for(let i=0;i<10000;i++){
const r=Math.random()*10000;
if(r*0.5!=r/2){
document.write(r+"<br/>");
break;
}
}
for(let i=0;i<10000;i++){
const r=Math.random()*10000;
if(r*4!=r/0.25){
document.write(r+"<br/>");
break;
}
}
for(let i=0;i<10000;i++){
const r=Math.random()*10000;
if(r*0.125!=r/8){
document.write(r+"<br/>");
break;
}
}
测试了几次,没有打印反例。但我不知道是否适用于所有其他情况。
注意:y 不包括像 0.1 和 0.2 这样的数字,因为 0.1 和 0.2 不能完全用浮点数表示,而 0.5 和 0.25 可以。 y 也不像 1.25,因为 x=1/1.25=0.8,而 0.8 也不能用浮点数完美表示。