Sind für eine Gleitkommazahl x ohne Unterlauf und Überlauf die Ergebnisse von x+x und x*2 gleich?
P粉064448449
P粉064448449 2023-09-07 10:08:44
0
1
565

Zum Beispiel hatte ich zunächst diesen Code:

function(x,y){
  let z=x+y;
  .
  .
  .
}

Später entdeckte ich, dass y dasselbe sein muss wie x. Ich wollte x+y in x * 2 umwandeln, musste aber sicherstellen, dass sich das gesamte Programm vor und nach der Rekonstruktion gleich verhält. Ist x+x dasselbe wie x*2? Ich frage mich, ob + und * unterschiedliche Berechnungsmechanismen verwenden, was zu unterschiedlichen Rundungsergebnissen führt.

Ich habe getestet:

for(let i=0.01;i<100;i++){
  if(i+i!=i*2){
    console.log(i);
    break;
  }
}

Scheint für bestimmte Bereiche von i korrekt zu sein, bin mir aber nicht sicher, ob es für alle Gleitkommazahlen korrekt ist.

P粉064448449
P粉064448449

Antworte allen(1)
P粉012875927

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+x code> 和 2*x 必须产生相同的计算结果。如果应用相同的舍入规则,两者将得到相同的数学结果,因此计算结果必须相同。

上面涵盖了x是数字的情况,包括+∞和-∞。如果 xNaN,则 x+x2*x 也会产生 NaN code>,所以结果又是一样的。 (请注意,在这种情况下,x+x == 2*x 将计算为 false,因为 NaN 不等于任何内容,甚至不等于其本身。尽管如此,这两个运算会产生相同的结果;如果使用 2*x 代替 x+x,程序行为将是相同的,反之亦然。)

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage