SORU
29 Temmuz 2011, Cuma


Neden 0.1 0.2 == 0.3 D?

assert(0.1   0.2 != 0.3); // shall be true

bir dil yerel kayan noktalı aritmetik kullanan en sevdiğim kontrol edin.

C

#include <cstdio>

int main()
{
   printf("%d\n", (0.1   0.2 != 0.3));
   return 0;
}

Çıkış:

1

http://ideone.com/ErBMd

Python

print(0.1   0.2 != 0.3)

Çıkış:

True

http://ideone.com/TuKsd

Diğer örnekler

Neden bu D için değil, doğru mu? D yerel kayan nokta sayıları kullanır anlamak. Bu bir hata mı? Bazı belirli sayıda temsil kullanıyorlar mı? Başka bir şey mi? Oldukça kafa karıştırıcı.

D

import std.stdio;

void main()
{
   writeln(0.1   0.2 != 0.3);
}

Çıkış:

false

http://ideone.com/mX6zF

GÜNCELLEME

24* *için teşekkürler. Bu Noktada Sabit Katlama 25 ** açıklanan Yüzen bir etkidir.

Kod:

import std.stdio;

void main()
{
   writeln(0.1   0.2 != 0.3); // constant folding is done in real precision

   auto a = 0.1;
   auto b = 0.2;
   writeln(a   b != 0.3);     // standard calculation in double precision
}

Çıkış:

false
true

http://ideone.com/z6ZLk

CEVAP
29 Temmuz 2011, Cuma


(Flynn cevabı doğru cevap. Bu daha genel bir sorunu giderir.)


OP varsayarak gibisin, kodunuzda kayan nokta yanlışlık determinist olduğunu vetahmin edilebileceği gibi yanlış(bir şekilde, yaklaşımın kayan nokta hala anlamış) bilmeyen insanlar bunun tam zıttı.

Ancak Ben belirttiği gibi ()-kayan nokta hata vareğer her adımda senin değerlerin neler olduğuyla ilgili çok temkinli olmak durumunda değil deterministik, kodunuzu bakış açısından, bu böyle olmayacak. Faktörlerin herhangi bir sayı 0.1 0.2 == 0.3 başarılı,-zaman derleme bir varlık optimizasyonu, o rakamları için değerleri orospuluk başka bir varlık neden olabilir.

Burada kullanırikisi de değilbaşarısızlığı başarı ne de; kayan nokta eşitlik güvenmeyinher iki şekilde de.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dave Wallace

    Dave Wallace

    27 Kasım 2007
  • David Tedeyev

    David Tedeye

    20 AĞUSTOS 2011
  • TechSmartt

    TechSmartt

    29 Aralık 2010