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.floatdoublefloat , 7'dir.
Basamak sayısı şu şekilde hesaplanır:
double52 mantis biti + 1 gizli biti var: log (2 53 ) ÷ log (10) = 15,95 basamak
float23 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ı) doublebasit 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 doubleyeterince 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) intveya 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, doubleve öğ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).