例如,最初我有这样的代码:
function(x,y){
let z=x+y;
.
.
.
}
后来我发现y必须与x相同,想将x+y重构为x * 2,但需要保证重构前后整个程序的行为相同。 x+x 与 x*2 相同吗?我不知道 + 和 * 是否使用不同的计算机制,从而导致舍入到不同的结果。
我测试过:
for(let i=0.01;i<100;i++){
if(i+i!=i*2){
console.log(i);
break;
}
}
对于 i 的某些范围似乎是正确的,但不知道是否对于所有浮点数都正确。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
JavaScript 是 ECMAScript 的实现,并且 ECMAScript 规范 表示使用 IEEE 754 算法,IEEE-754“双精度” ”(binary64)格式。第 5.2.5 条规定“……当应用于数字时,运算符指的是 IEEE 754-2019 中的相关运算……”
在 IEEE 754 和任何合理的浮点系统中,运算的结果是根据选择的舍入规则舍入的精确数学结果(例如舍入到最近的联系到偶数、舍入到偶数)向零、向上舍入或向下舍入)。 IEEE 754-2019 4.3 说:
由于
x+x和 2•x具有相同的数学结果,因此浮点运算x+xcode> 和2*x必须产生相同的计算结果。如果应用相同的舍入规则,两者将得到相同的数学结果,因此计算结果必须相同。上面涵盖了
x是数字的情况,包括+∞和-∞。如果x是NaN,则x+x和2*x也会产生NaNcode>,所以结果又是一样的。 (请注意,在这种情况下,x+x == 2*x将计算为 false,因为 NaN 不等于任何内容,甚至不等于其本身。尽管如此,这两个运算会产生相同的结果;如果使用2*x代替x+x,程序行为将是相同的,反之亦然。)