Untuk nombor titik terapung x, tanpa aliran bawah dan limpahan, adakah keputusan x+x dan x*2 adalah sama?
P粉064448449
P粉064448449 2023-09-07 10:08:44
0
1
549

Sebagai contoh, pada mulanya saya mempunyai kod ini:

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

Kemudian saya dapati bahawa y mestilah sama dengan x Saya ingin membina semula x+y menjadi x * 2, tetapi saya perlu memastikan bahawa keseluruhan program berkelakuan sama sebelum dan selepas pembinaan semula. Adakah x+x sama dengan x*2? Saya tertanya-tanya jika + dan * menggunakan mekanisme pengiraan yang berbeza, yang membawa kepada pembundaran kepada hasil yang berbeza.

Saya menguji:

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

Nampaknya betul untuk julat tertentu i , tetapi tidak pasti sama ada ia betul untuk semua nombor titik terapung.

P粉064448449
P粉064448449

membalas semua(1)
P粉012875927

JavaScript ialah pelaksanaan ECMAScript, dan spesifikasi ECMAScript bermaksud menggunakan algoritma IEEE 754, format IEEE-754 "double precision" (binary64) Fasal 5.2.5 menyatakan "... apabila digunakan pada nombor, operator Merujuk kepada operasi yang berkaitan dalam IEEE 754-2019..."

Dalam IEEE 754 dan mana-mana sistem titik terapung yang munasabah, hasil operasi ialah keputusan matematik tepat yang dibundarkan mengikut peraturan pembundaran yang dipilih (cth., bulat ke terdekat, bulat ke genap, bulat ke genap), bulat ke sifar, bulat ke atas dibulatkan ke atas atau ke bawah). IEEE 754-2019 4.3 berkata:

Memandangkan x+x 和 2•x 具有相同的数学结果,因此浮点运算 x+x code> 和 2*x mesti menghasilkan hasil pengiraan yang sama. Jika peraturan pembundaran yang sama digunakan, kedua-duanya akan memberikan hasil matematik yang sama, jadi pengiraan mestilah sama.

Yang dibincangkan di atas x是数字的情况,包括+∞和-∞。如果 xNaN,则 x+x2*x 也会产生 NaN code>,所以结果又是一样的。 (请注意,在这种情况下,x+x == 2*x 将计算为 false,因为 NaN 不等于任何内容,甚至不等于其本身。尽管如此,这两个运算会产生相同的结果;如果使用 2*x 代替 x+x, tingkah laku program akan sama dan begitu juga sebaliknya. )

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan