Perbedaan besar
Sesuai namanya, a double
memiliki 2x presisi [1] . Secara umum a memiliki 15 digit desimal presisi, sementarafloat
double
float
memiliki 7.
Begini cara menghitung jumlah digit:
double
memiliki 52 mantissa bit + 1 bit tersembunyi: log (2 53 ) ÷ log (10) = 15,95 digit
float
memiliki 23 bit mantissa + 1 bit tersembunyi: log (2 24 ) ÷ log (10) = 7.22 digit
Kehilangan presisi ini dapat menyebabkan kesalahan pemotongan yang lebih besar terakumulasi ketika perhitungan berulang dilakukan, misalnya
float a = 1.f / 81;
float b = 0;
for (int i = 0; i < 729; ++ i)
b += a;
printf("%.7g\n", b); // prints 9.000023
sementara
double a = 1.0 / 81;
double b = 0;
for (int i = 0; i < 729; ++ i)
b += a;
printf("%.15g\n", b); // prints 8.99999999999996
Juga, nilai maksimum float adalah tentang 3e38
, tetapi dua kali lipat adalah tentang 1.7e308
, jadi menggunakan float
dapat menekan "tak terbatas" (yaitu angka floating-point khusus) lebih mudah daripadadouble
untuk sesuatu yang sederhana, misalnya menghitung faktorial 60.
Selama pengujian, mungkin beberapa kasus uji berisi angka besar ini, yang dapat menyebabkan program Anda gagal jika Anda menggunakan pelampung.
Tentu saja, kadang-kadang, bahkan double
tidak cukup akurat, maka kita kadang-kadang memiliki long double
[1] (contoh di atas memberikan 9,00000000000000000066 pada Mac), tetapi semua tipe floating point menderita kesalahan pembulatan , jadi jika presisi sangat penting (misalnya uang) pemrosesan) Anda harus menggunakan int
atau kelas pecahan.
Selain itu, jangan gunakan +=
untuk menjumlahkan banyak angka floating point, karena kesalahan menumpuk dengan cepat. Jika Anda menggunakan Python, gunakan fsum
. Jika tidak, cobalah untuk mengimplementasikan algoritma penjumlahan Kahan .
[1]: Standar C dan C ++ tidak menentukan representasi float
, double
dan long double
. Ada kemungkinan bahwa ketiganya diimplementasikan sebagai presisi ganda IEEE. Namun demikian, untuk sebagian besar arsitektur (gcc, MSVC; x86, x64, ARM) float
adalah memang IEEE presisi tunggal floating point nomor (binary32), dan double
merupakan sebuah IEEE double-presisi floating point nomor (binary64).