Sự khác biệt giữa Float và Double - Tôi nên sử dụng cái nào?

(Lưu ý: Bài viết này giả định rằng người đọc biết về những điều cơ bản của Khoa học Máy tính)

Nhiều lập trình viên / sinh viên mới đăng ký vào Khoa học Máy tính hỏi những câu hỏi thường gặp có liên quan đến lĩnh vực cụ thể trong Khoa học Máy tính mà họ đang học. Hầu hết các khóa học dành cho người mới bắt đầu với các chủ đề của hệ thống số được sử dụng trong các máy tính hiện đại, bao gồm cả nhị phân, số thập phân, bát phân thập lục phân hệ thống. Đây là các định dạng số máy tính là biểu diễn bên trong của các giá trị số trong máy tính (hoặc máy tính và bất kỳ loại máy tính kỹ thuật số nào khác). Các giá trị này được lưu trữ dưới dạng nhóm của Bit.

Như chúng ta đã biết máy tính biểu thị dữ liệu theo bộ các chữ số nhị phân (nghĩa là, kết hợp với 1 giây0 giây, nhu la, 1111 đại diện 15 trong hệ thập phân), sẽ hợp lý khi dạy về các định dạng số khác nhau được sử dụng để biểu thị một phạm vi giá trị động, bởi vì chúng tạo thành các khối cơ bản của xử lý tính toán / số trong bất kỳ loại hoạt động nào. Khi hệ thống số được xác định trong lớp học (thường là kém), học sinh được khuyến khích chuyển sang các định dạng số khác nhau trong cùng một loại (tức là., số học dấu phẩy động) có độ chính xác và phạm vi số nhất định. Vì vậy, họ buộc phải tìm hiểu các sắc thái giữa các loại nhất định. Hai trong số các loại dữ liệu được sử dụng phổ biến nhất là Phao nổi Gấp đôi, và trong khi họ nhắm đến cùng một nhu cầu (tức là., số học dấu phẩy động), có khá nhiều sự khác biệt trong biểu diễn bên trong của chúng và ảnh hưởng tổng thể đến tính toán trong chương trình. Thật không may khi nhiều lập trình viên bỏ lỡ các sắc thái giữa các kiểu dữ liệu Flat và Double và cuối cùng họ sử dụng sai ở những nơi không nên sử dụng ở nơi đầu tiên. Cuối cùng dẫn đến tính toán sai trong các phần khác của chương trình.

Trong bài viết này, tôi sẽ nói cho bạn biết sự khác biệt giữa float và double với các ví dụ mã trong ngôn ngữ lập trình C. Bắt đầu nào!

Phao so với đôi ván là gì Thỏa thuận?

Float và Double là biểu diễn dữ liệu được sử dụng cho các phép toán số học dấu phẩy động, hãy nghĩ đến các số thập phân mà bạn tính toán trong lớp toán học, chẳng hạn như, 20.123, 16,23, 10.2, v.v., chúng không phải là số nguyên (tức là., 2, 5, 15, v.v.), do đó họ yêu cầu xem xét các phân số trong nhị phân. Là số thập phân tổng hợp (nghĩa là., 20.123, 16,23, v.v.) không thể được biểu diễn dễ dàng bằng định dạng nhị phân thông thường (nghĩa là, Số nguyên). Sự khác biệt chính giữa Float và Double là trước đây là dữ liệu điểm nổi có độ chính xác đơn (32 bit), trong khi dữ liệu sau là loại dữ liệu dấu phẩy động có độ chính xác kép (64 bit). Double được gọi là gấp đôi, vì về cơ bản, đây là phiên bản chính xác của Float. Nếu bạn đang tính một số tiền rất lớn (nghĩ về hàng nghìn số 0), thì độ chính xác sẽ nhỏ hơn trong Double và bạn sẽ không mất nhiều độ chính xác.

Nó là tốt hơn để xây dựng bằng cách sử dụng các ví dụ mã. Sau đây là thao tác trên Float và Double thông qua các hàm toán học được cung cấp bằng ngôn ngữ C:

#incolee

int chính ()

phao số1 = 1.f / 82;

phao số2 = 0;

cho (int i = 0; i < 738; ++i)

num2 + = num1;

printf (%%. 7g \ n, num2);

gấp đôi số 3 = 1,0 / 82;

số kép = 0;

cho (int i = 0; i < 738; ++i)

num4 + = num3;

printf (%%. 15g \ n, số 4);

getar ();

Nó in như sau:

9.000031

8,99999999999983

Ở đây, bạn có thể thấy rằng sự khác biệt nhỏ về độ chính xác của Float và Double mang đến một câu trả lời hoàn toàn khác, mặc dù Double dường như chính xác hơn Float.

Sau đây là ví dụ về hàm sqrt () trong C:

#incolee

#incolee

int chính ()

float num1 = sqrt (2382719676512365.1230112312312312);

gấp đôi num2 = sqrt (2382719676512365.1230112312312312);

printf (Lời% f f n n, num1);

printf (Lời% f f n n, num2);

getar ();

Nó cho đầu ra sau:

48813108.000000

48813109.678778

Ở đây, bạn có thể thấy rằng câu trả lời trong Double có độ chính xác tốt hơn.

Nói chung, tốt hơn là sử dụng Double cho số học dấu phẩy động, vì một số hàm toán học tiêu chuẩn trong C hoạt động trên máy tính Double và hiện đại cực kỳ nhanh và hiệu quả cho phép tính dấu phẩy động kép. Điều này dẫn đến việc giảm nhu cầu sử dụng Float, trừ khi bạn cần phải hoạt động trên nhiều số dấu phẩy động (nghĩ về các mảng lớn có hàng nghìn số 0) hoặc bạn đang vận hành trên một hệ thống không hỗ trợ gấp đôi điểm nổi chính xác, vì nhiều GPU, thiết bị có công suất thấp và một số nền tảng nhất định (ARM Cortex-M2, Cortex-M4, v.v.) chưa hỗ trợ Double, nên bạn nên sử dụng Float. Ngoài ra, một điều cần nhớ là một số GPU / CPU nhất định hoạt động tốt hơn / hiệu quả hơn trong xử lý Float, như trong tính toán vectơ / ma trận, do đó bạn có thể cần xem hướng dẫn / tài liệu đặc tả phần cứng để quyết định tốt hơn bạn nên sử dụng loại nào cho một máy cụ thể.

Hiếm khi có một lý do để sử dụng Float thay vì Double trong mã nhắm vào các máy tính hiện đại. Độ chính xác bổ sung trong Double giảm, nhưng không loại trừ, khả năng xảy ra lỗi làm tròn hoặc sự thiếu chính xác khác có thể gây ra sự cố trong các phần khác của chương trình. Nhiều hàm toán tử hoặc toán tử chuyển đổi và trả về Double, vì vậy bạn không cần phải chuyển các số trở lại Float, vì điều đó có thể làm mất độ chính xác. Để phân tích chi tiết về số học dấu phẩy động, tôi khuyên bạn nên đọc bài viết tuyệt vời này (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html).

Tóm lược

Vì vậy, một cách ngắn gọn:

Những nơi bạn nên sử dụng Float:

  • Nếu bạn đang nhắm mục tiêu phần cứng trong đó độ chính xác đơn nhanh hơn độ chính xác kép.
  • Ứng dụng của bạn sử dụng rất nhiều số học dấu phẩy động, như hàng ngàn số với hàng nghìn 0.
  • Bạn đang làm tối ưu hóa ở mức rất thấp. Chẳng hạn, bạn đang sử dụng các hướng dẫn CPU đặc biệt (tức là SSE, SSE2, AVX, v.v.) hoạt động trên nhiều số / mảng / vectơ cùng một lúc.

Phần kết luận

Trong bài viết này tôi đã nhấn mạnh sự khác biệt giữa Float và Double, và cái nào nên được sử dụng ở những nơi cụ thể. Có thể cho rằng, tốt hơn hết là sử dụng Double ở hầu hết các nơi một cách mù quáng, đặc biệt nếu bạn đang nhắm mục tiêu vào các máy tính hiện đại, vì khả năng hiệu quả thấp do sử dụng số học dấu phẩy động kép là rất khó xảy ra. Nếu bạn có bất kỳ câu hỏi nào, thì bạn có thể hỏi trong phần bình luận bên dưới!