Maison  >  Questions et réponses  >  le corps du texte

Pour un nombre à virgule flottante x, sans dépassement ni débordement, les résultats de x+x et x*2 sont-ils les mêmes ?

Par exemple, au départ j'avais ce code :

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

Plus tard, j'ai découvert que y devait être identique à x. Je voulais reconstruire x+y en x * 2, mais je devais m'assurer que l'ensemble du programme se comportait de la même manière avant et après la reconstruction. Est-ce que x+x est identique à x*2 ? Je me demande si + et * utilisent des mécanismes de calcul différents, conduisant à des arrondis à des résultats différents.

J'ai testé :

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

Cela semble être correct pour certaines plages de i , mais je ne sais pas si c'est correct pour tous les nombres à virgule flottante.

P粉064448449P粉064448449395 Il y a quelques jours497

répondre à tous(1)je répondrai

  • P粉012875927

    P粉0128759272023-09-08 00:13:03

    JavaScript est une implémentation de ECMAScript, et la spécification ECMAScript signifie utiliser l'algorithme IEEE 754, le format IEEE-754 "double précision" (binary64) qui stipule "... lorsqu'il est appliqué aux nombres, opérateurs Fait référence aux opérations pertinentes dans IEEE 754-2019..."

    Dans IEEE 754 et tout système à virgule flottante raisonnable, le résultat d'une opération est un résultat mathématique exact arrondi selon la règle d'arrondi choisie (par exemple, arrondir au plus proche, arrondir au pair, arrondir au pair), arrondir à zéro, arrondir arrondi au supérieur ou à l'inférieur). IEEE 754-2019 4.3 dit :

    Puisque x+x 和 2•x 具有相同的数学结果,因此浮点运算 x+x code> 和 2*x doit produire le même résultat de calcul. Si les mêmes règles d’arrondi sont appliquées, les deux donneront le même résultat mathématique, les calculs doivent donc être les mêmes.

    Ce qui précède x是数字的情况,包括+∞和-∞。如果 xNaN,则 x+x2*x 也会产生 NaN code>,所以结果又是一样的。 (请注意,在这种情况下,x+x == 2*x 将计算为 false,因为 NaN 不等于任何内容,甚至不等于其本身。尽管如此,这两个运算会产生相同的结果;如果使用 2*x 代替 x+x, le comportement du programme sera le même et vice versa. )

    répondre
    0
  • Annulerrépondre