Sự khác nhau giữa Float và Double

float va double

Sự khác biệt lớn.

Như tên của nó, a double có độ chính xác gấp 2 lần float[1]. Nói chung, một double có 15 chữ số thập phân có độ chính xác, trong khi float có 7.

Đây là cách tính số chữ số:

double có 52 bit mantissa + 1 bit ẩn: log (253) Log (10) = 15,95 chữ số

float có 23 bit mantissa + 1 bit ẩn: log (224) Log (10) = 7,22 chữ số

Mất chính xác này có thể dẫn đến các lỗi cắt ngắn dễ dàng hơn nhiều để nổi lên, ví dụ:.

float a = 1.f / 81;
float b = 0;
for (int i = 0; i < 729; ++ i)
    b += a;
printf("%.7g\n", b); // prints 9.000023

trong khi

double a = 1.0 / 81;
double b = 0;
for (int i = 0; i < 729; ++ i)
    b += a;
printf("%.15g\n", b); // prints 8.99999999999996

Ngoài ra, giá trị nổi tối đa là khoảng 3e38, nhưng gấp đôi là về 1.7e308, do đó, sử dụng float có thể đạt “vô cực” (nghĩa là một số dấu phẩy động đặc biệt) dễ dàng hơn nhiều so với double cho một thứ đơn giản, ví dụ: tính toán giai thừa của 60.

Trong quá trình thử nghiệm, có thể một vài trường hợp thử nghiệm chứa những con số khổng lồ này, điều này có thể khiến các chương trình của bạn bị lỗi nếu bạn sử dụng phao.


Tất nhiên, đôi khi, thậm chí double không đủ chính xác, do đó đôi khi chúng ta có long double[1] (ví dụ trên cung cấp 9.000000000000000066 trên máy Mac), nhưng tất cả các loại dấu phẩy động đều bị lỗi làm tròn, vì vậy nếu độ chính xác là rất quan trọng (ví dụ: xử lý tiền), bạn nên sử dụng int hoặc một lớp phân số.


Hơn nữa, không sử dụng += để tổng hợp nhiều số dấu phẩy động, vì các lỗi tích lũy nhanh chóng. Nếu bạn đang sử dụng Python, hãy sử dụng fsum. Nếu không, hãy thử thực hiện thuật toán tổng hợp Kahan .


[1]: Các tiêu chuẩn C và C++ không chỉ định biểu diễn của floatdouble và long double. Có thể là cả ba đều được triển khai dưới dạng chính xác kép của IEEE. Tuy nhiên, đối với hầu hết các kiến ​​trúc (gcc, MSVC; x86, x64, ARM) floatis thực sự là một số dấu phẩy động chính xác duy nhất của IEEE (binary32) và doubleis a IEEE double- số dấu phẩy động chính xác (binary64).

 

Để lại một bình luận