Sự khác biệt giữa nổi và đôi - Tôi nên dùng cái nào? Sự khác biệt giữa

Anonim

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

Nhiều lập trình newbie / sinh viên đăng ký trong Khoa học Máy tính hỏi những câu hỏi thường gặp liên quan đến lĩnh vực cụ thể trong Khoa học Máy tính mà họ đang theo học. Hầu hết các khóa học bắt đầu bắt đầu bằng 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 nhị phân , thập phân , bát phân và thập lục phân <. Đây là các định dạng số máy tính là các đại diện nội bộ 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ác bit". Như chúng ta biết máy tính đại diện cho dữ liệu trong bộ chữ số nhị phân (tức là, trong sự kết hợp của

1s

0s , chẳng hạn như 1111 đại diện cho 15 trong hệ thập phân), có ý nghĩa để dạy về các định dạng số khác nhau được sử dụng để biểu diễn dải động của các giá trị vì chúng tạo thành các khối cơ bản của việc tính toán / xử lý số trong bất kỳ hoạt động nào. Một khi hệ thống số được xác định trong lớp học (thường là kém), học sinh sẽ bị cám dỗ chuyển sang các định dạng số khác nhau trong cùng một loại (nghĩa là điểm số phảy động ) có độ chính xác và phạm vi số nhất định. Do đó, họ buộc phải học các sắc thái giữa các loại nhất định. Hai loại dữ liệu được sử dụng phổ biến nhất là Float Đôi và trong khi chúng nhắm mục tiêu các nhu cầu giống nhau (tức là số học dấu phảy động ), có khá một số khác biệt trong biểu diễn nội bộ của họ và ảnh hưởng tổng thể lên tính trong chương trình. Không may là nhiều lập trình viên bỏ lỡ những khác biệt giữa các loại dữ liệu Đơn và đôi và kết thúc việc lạm dụng chúng ở những nơi mà chúng không được sử dụng ở nơi đầu tiên. Kết quả là tính sai lệch trong các phần khác của chương trình. Trong bài này, tôi sẽ cho bạn biết sự khác biệt giữa float và double với các ví dụ code trong ngôn ngữ lập trình C. Băt đâu nao! Float vs Double … Thỏa thuận là gì?

Float và Double là dữ liệu được sử dụng cho các phép toán số học nổi điểm, suy nghĩ về 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 2 , 5 , 15 , v.v …), do đó yêu cầu xem xét phân số trong nhị phân. Là số thập phân kết quả (ví dụ: 20. 123 , 16. 23 , v.v …) không thể dễ dàng được đại diện với một định dạng nhị phân bình thường (ví dụ: Số nguyên). Sự khác biệt chính giữa Float và Double là dữ liệu điểm nổi chính xác duy nhất (32 bit), còn loại thứ hai là kiểu dữ liệu điểm nổi chính xác gấp đôi (64 bit). Double được gọi là "double" vì nó về cơ bản là một phiên bản chính xác gấp đôi của Float. Nếu bạn đang tính toán một số tiền khổng lồ (suy nghĩ của hàng ngàn số 0 trong số), sau đó không chính xác sẽ nhỏ hơn trong Double và bạn sẽ không mất nhiều chính xác.

Tốt hơn là xây dựng bằng cách sử dụng các ví dụ mã. Sau đây là các 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: #include

int main () {

float num1 = 1. f / 82;

float num2 = 0;

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

num2 + = num1;

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

đôi num3 = 1. 0/82;

hai lần num4 = 0;

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

num4 + = num3;

printf ("%. 15g n", num4);

getchar ();

}

Nó in ra những thứ sau:

9. 000031

8. 99999999999983

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

Ví dụ về hàm sqrt () trong C:

#include

#include

int main () {

float num1 = sqrt (2382719676512365) 1230112312312312);

đôi num2 = sqrt (2382719676512365.1230112312312312);

printf ("% f n", num1);

printf ("% f n", num2);

getchar ();

}

Nó đưa ra kết quả 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.

Tất cả trong tất cả, tốt hơn là sử dụng Double cho số học điểm nổi, như một số chức năng toán học tiêu chuẩn trong C hoạt động trên máy tính đôi và hiện đại cực kỳ nhanh chóng và hiệu quả cho tính toán điểm nổi hai điểm. Đ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 vận hành trên nhiều số điểm nổi (suy nghĩ của mảng lớn với hàng ngàn số 0 trong số) hoặc bạn đang hoạt động trên một hệ thống không hỗ trợ tăng gấp đôi, điểm nổi chính xác, nhiều GPU, thiết bị chạy ít và các nền nhất định (ARM Cortex-M2, Cortex-M4, vv) không hỗ trợ Double, sau đó bạn nên sử dụng Float. Ngoài ra, cần lưu ý rằng một số GPU / CPU nào đó hoạt động tốt hơn / hiệu quả trong quá trình xử lý Float, như trong việc tính toán các vectơ / ma trận, do đó bạn có thể cần phải tìm trong hướng dẫn / tài liệu hướng dẫn đặc tả phần cứng để quyết định bạn nên sử dụng cho một máy cụ thể.

Không có lý do gì để sử dụng Float thay vì Double trong mã nhắm mục tiêu đến các máy tính hiện đại. Độ chính xác cao trong Double làm giảm, nhưng không loại bỏ, cơ hội bị lỗi làm tròn hoặc sự không chính xác khác có thể gây ra các vấn đề trong các phần khác của chương trình. Nhiều chức năng toán học hoặc các toán tử chuyển đổi và trả về Double, vì vậy bạn không cần phải ném các con số trở lại Float, vì điều này có thể làm mất độ chính xác.Để có một phân tích chi tiết về số học số Floating-point, tôi khuyên bạn nên đọc bài báo này tuyệt vời (// docs. Oracle. Com / cd / E19957-01 / 806-3568 / ncg_goldberg. Html).

Tóm tắt

Vì vậy … tóm lại:

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

Nếu bạn đang nhắm đến phần cứng, nơi đơn chính xác nhanh hơn độ chính xác gấp đôi.

Ứng dụng của bạn sử dụng nặng số học số nổi, như hàng nghìn số với hàng ngàn số của 0.

Bạn đang thực hiện tối ưu hóa ở mức rất thấp. Ví dụ: bạn đang sử dụng hướng dẫn CPU đặc biệt (ví dụ SSE, SSE2, AVX, v.v …) hoạt động trên nhiều số / mảng / vectors một lần.

Trong bài này tôi đã nêu bật 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ể nói, tốt hơn 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 tới các máy tính hiện đại, vì cơ hội hiệu suất thấp do sử dụng số học số học tăng gấp đôi là rất khó xảy ra. Nếu bạn có bất kỳ câu hỏi, sau đó bạn có thể yêu cầu trong phần bình luận dưới đây!