Büyük farklılık.
Adından da anlaşılacağı gibi, a [1] 'double
in 2 katına sahiptir . Genel olarak a , 15 ondalık basamak hassasiyete sahiptir.float
double
float
, 7'dir.
Basamak sayısı şu şekilde hesaplanır:
double
52 mantis biti + 1 gizli biti var: log (2 53 ) ÷ log (10) = 15,95 basamak
float
23 mantis biti + 1 gizli biti vardır: log (2 24 ) ÷ log (10) = 7.22 basamak
Bu hassas kayıp, tekrarlanan hesaplamalar yapıldığında daha büyük kesme hatalarına yol açabilir, örn.
float a = 1.f / 81;
float b = 0;
for (int i = 0; i < 729; ++ i)
b += a;
printf("%.7g\n", b); // prints 9.000023
süre
double a = 1.0 / 81;
double b = 0;
for (int i = 0; i < 729; ++ i)
b += a;
printf("%.15g\n", b); // prints 8.99999999999996
Ayrıca, şamandıra maksimum değeri yaklaşık 3e38
, ancak çift yaklaşık 1.7e308
, bu yüzden kullanmak float
"sonsuzluk" (yani özel bir kayan nokta sayısı) double
basit bir şeyden çok daha kolay vurabilir , örneğin 60 faktöriyelini hesaplamak.
Test sırasında, birkaç test vakası bu büyük sayıları içerebilir, bu da şamandıralar kullanırsanız programlarınızın başarısız olmasına neden olabilir.
Tabii ki, bazen double
yeterince doğru bile değil, bu yüzden bazen long double
[1] (yukarıdaki örnek Mac'te 9.000000000000000066 verir), ancak tüm kayan nokta türleri yuvarlama hatalarından muzdariptir , bu nedenle hassasiyet çok önemliyse (örn. Para işleme) int
veya bir kesir sınıfını kullanmalısınız .
Ayrıca, +=
hatalar hızla biriktiğinden çok sayıda kayan nokta sayısını toplamak için kullanmayın . Python kullanıyorsanız, kullanın fsum
. Aksi takdirde, Kahan toplama algoritmasını uygulamaya çalışın .
[1]: C ve C ++ standartları float
, double
ve öğelerinin temsilini belirtmez long double
. Her üçünün de IEEE çift kesinlikli olarak uygulanması mümkündür. Bununla birlikte, en mimarilerinde (gcc MSVC; 86, 64, KOL) float
olan gerçekten nokta sayısı (binary32) değişken bir IEEE tek hassasiyetli ve double
bir IEEE çift kesinlikli kayar ayırmalı sayı (binary64).