如果 y=1/x 其中 x,y 可以用浮点数表示而不四舍五入,并且 MIN_VALUE<=x,y,z,z*y<=MAX_VALUE, is z*y==z/x always true?

问题描述 投票:0回答:1

我正在查看一些代码,发现一些部分使用 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 也不能用浮点数完美表示。

javascript floating-point precision
1个回答
0
投票

浮点数学被打破,因此一般

(x * 1/y) != (x / y)

> 0.2 / 10
< 0.02
> 0.2 * (1/10)
< 0.020000000000000004
© www.soinside.com 2019 - 2024. All rights reserved.