Perbedaan besar
Sesuai namanya, a doublememiliki 2x presisi [1] . Secara umum a memiliki 15 digit desimal presisi, sementarafloatdoublefloat memiliki 7.
Begini cara menghitung jumlah digit:
doublememiliki 52 mantissa bit + 1 bit tersembunyi: log (2 53 ) ÷ log (10) = 15,95 digit
floatmemiliki 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 floatdapat 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 doubletidak 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 intatau 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, doubledan 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).