Helpex - Trao đổi & giúp đỡ Đăng nhập
16

C ++ cung cấp ba kiểu dấu phẩy động: float, double và long double. Tôi không thường xuyên sử dụng dấu phẩy động trong mã của mình, nhưng khi tôi sử dụng, tôi luôn bị phát hiện bởi những cảnh báo trên những dòng vô hại như

float PiForSquares = 4.0;

Vấn đề là 4.0 theo nghĩa đen là kép, không phải là phao - Điều đó gây khó chịu.

Đối với các kiểu số nguyên, chúng ta có int ngắn, int và dài, khá đơn giản. Tại sao C không chỉ có phao ngắn, phao nổi và phao dài? Và "nhân đôi" đến từ đâu?

CHỈNH SỬA: Có vẻ như mối quan hệ giữa các kiểu số động tương tự như mối quan hệ của các số nguyên. Double ít nhất phải lớn bằng float, và double dài ít nhất phải lớn bằng double. Không có đảm bảo nào khác về độ chính xác / phạm vi được thực hiện.

16 hữu ích 5 bình luận 9.5k xem chia sẻ
12 trả lời 12
34

Thuật ngữ "độ chính xác đơn" và "độ chính xác kép" bắt nguồn từ FORTRAN và đã được sử dụng rộng rãi khi C được phát minh. Trên các máy đầu những năm 1970, độ chính xác đơn hiệu quả hơn đáng kể và cho đến ngày nay, sử dụng bộ nhớ bằng một nửa so với độ chính xác kép. Do đó, nó là một mặc định hợp lý cho các số dấu phẩy động.

long doubleđã được thêm vào sau đó khi tiêu chuẩn IEEE cho phép chip dấu phẩy động Intel 80287, sử dụng số dấu phẩy động 80-bit thay vì độ chính xác kép 64-bit cổ điển.

Người hỏi không chính xác về bảo lãnh; ngày nay hầu hết các ngôn ngữ đều đảm bảo thực hiện các số dấu phẩy động nhị phân IEEE 754 ở độ chính xác đơn (32 bit) và độ chính xác kép (64 bit). Một số cũng cung cấp độ chính xác mở rộng (80 bit), hiển thị trong C dưới dạng long double. Tiêu chuẩn dấu phẩy động IEEE, do William Kahan dẫn đầu, là một thành tựu của kỹ thuật tốt so với tính hiệu quả: trên những cỗ máy thời nay, nó trông cực kỳ đắt, nhưng trên những chiếc máy ngày nay thì nó rẻ như bèo, và tính di động và khả năng dự đoán của IEEE nổi số điểm phải tiết kiệm hàng năm đô la.

34 hữu ích 5 bình luận chia sẻ
25

Bạn có thể biết điều này, nhưng bạn có thể thực hiện các cú đánh nổi / dài gấp đôi theo nghĩa đen

 float f = 4.0f;
 long double f = 4.0l;

Double là mặc định vì đó là thứ mà hầu hết mọi người sử dụng. Những cú đánh đôi dài có thể quá mức cần thiết hoặc và những cú đánh nổi có độ chính xác rất kém. Double hoạt động cho hầu hết mọi ứng dụng.

Tại sao lại đặt tên? Một ngày tất cả những gì chúng tôi có là 32 bit số dấu phẩy động (thực sự thì tất cả những gì chúng tôi có là số điểm cố định, nhưng tôi lạc đề). Dù sao, khi dấu chấm động trở thành một đặc điểm phổ biến trong các kiến ​​trúc hiện đại, C có lẽ là từ dujour của ngôn ngữ khi đó, và cái tên "float" đã được đặt cho. Có vẻ có ý nghĩa.

Vào thời điểm đó, double có thể đã được nghĩ đến, nhưng không thực sự được triển khai trong cpu / fp của cpu thời đó là 16 hoặc 32 bit. Một khi bộ đôi được sử dụng trong nhiều kiến ​​trúc hơn, C có lẽ phải thêm nó vào. C cần một cái tên cho một thứ gì đó có kích thước gấp đôi một cái phao, do đó chúng ta có một cái tên gấp đôi. Sau đó, ai đó cần chính xác hơn nữa, chúng tôi nghĩ rằng anh ta bị điên. Chúng tôi đã thêm nó bằng mọi cách. Tên quadtuple (?) Quá mức cần thiết. Đôi dài là đủ tốt, và không ai gây ra nhiều tiếng ồn.

Một phần của sự nhầm lẫn là good-ole "int" dường như thay đổi theo thời gian. Nó từng là "int" có nghĩa là số nguyên 16 bit. Float, tuy nhiên, bị ràng buộc với IEEE std là số dấu phẩy động IEEE 32 bit. Vì lý do đó, C giữ float được định nghĩa là 32 bit và tạo thành double và long double để tham chiếu đến các tiêu chuẩn dài hơn.

25 hữu ích 5 bình luận chia sẻ
5

Chữ viết

Vấn đề là 4.0 theo nghĩa đen là kép, không phải là phao - Điều đó gây khó chịu.

Với hằng số, có một sự khác biệt quan trọng giữa số nguyên và số thực. Mặc dù tương đối dễ dàng để quyết định loại số nguyên nào sẽ sử dụng (bạn chọn đủ nhỏ nhất để giữ giá trị, với một số phức tạp thêm cho có dấu / không dấu), với float thì điều này không dễ dàng. Nhiều giá trị (bao gồm cả những giá trị đơn giản như 0,1) không thể được biểu thị chính xác bằng số thực và do đó việc lựa chọn kiểu không chỉ ảnh hưởng đến hiệu suất mà còn ảnh hưởng đến giá trị kết quả. Có vẻ như các nhà thiết kế ngôn ngữ C ưa thích sự mạnh mẽ so với hiệu suất trong trường hợp này và do đó họ quyết định biểu diễn mặc định phải là biểu diễn chính xác hơn.

Môn lịch sử

Tại sao C không chỉ có phao ngắn, phao nổi và phao dài? Và "nhân đôi" đến từ đâu?

Thuật ngữ "độ chính xác đơn" và "độ chính xác kép" bắt nguồn từ FORTRAN và đã được sử dụng rộng rãi khi C được phát minh.

5 hữu ích 0 bình luận chia sẻ
2

Đầu tiên, những tên này không dành riêng cho C ++, nhưng là thực tế khá phổ biến đối với bất kỳ kiểu dữ liệu dấu phẩy động nào triển khai IEEE 754.

Tên 'double' đề cập đến 'độ chính xác kép', trong khi float thường được cho là 'độ chính xác đơn'.

2 hữu ích 1 bình luận chia sẻ
1

Hai định dạng dấu phẩy động phổ biến nhất sử dụng 32-bit và 64-bit, định dạng dài hơn có kích thước "gấp đôi" kích thước của định dạng đầu tiên nên nó được gọi là "kép".

1 hữu ích 0 bình luận chia sẻ
1

Double được đặt tên như vậy vì nó gấp đôi "độ chính xác" của float. Thực sự, điều này có nghĩa là nó sử dụng gấp đôi không gian của một giá trị dấu phẩy động - nếu float của bạn là 32-bit, thì nhân đôi của bạn sẽ là 64-bit.

Tên gọi chính xác kép là một chút nhầm lẫn, vì phao chính xác kép có độ chính xác phần định trị là 52 bit, trong đó phao chính xác đơn có độ chính xác phần định là 23 bit (gấp đôi là 56). Thông tin thêm về dấu phẩy động tại đây: Dấu phẩy động - Wikipedia , bao gồm các liên kết ở cuối các bài viết về dấu phẩy động chính xác đơn và kép.

Tên dài double có khả năng giống với truyền thống giống như số nguyên dài so với số nguyên ngắn cho các loại tích phân, ngoại trừ trường hợp này họ đảo ngược nó vì 'int' tương đương với 'long int'.

1 hữu ích 0 bình luận chia sẻ
1

Trong biểu diễn điểm cố định, có một số chữ số cố định sau điểm cơ số (tổng quát của dấu thập phân trong biểu diễn thập phân). Đối lập với điều này với các biểu diễn dấu phẩy động trong đó điểm cơ số có thể di chuyển hoặc nổi, trong các chữ số của số được biểu diễn. Vì vậy, tên "biểu diễn dấu phẩy động." Điều này đã được viết tắt thành "float".

Trong K&R C, floatđề cập đến các biểu diễn dấu phẩy động với biểu diễn nhị phân 32 bit và doubleđược gọi là biểu diễn dấu phẩy động với biểu diễn nhị phân 64 bit, hoặc gấp đôi kích thước và tên gọi. Tuy nhiên, đặc điểm kỹ thuật K&R ban đầu yêu cầu tất cả các phép tính dấu phẩy động phải được thực hiện với độ chính xác gấp đôi.

Trong tiêu chuẩn IEEE 754 ban đầu (IEEE 754-1985), tiêu chuẩn vàng cho các biểu diễn dấu phẩy động và số học, các định nghĩa được cung cấp cho các biểu diễn nhị phân của số dấu chấm động chính xác đơn và chính xác kép. Số chính xác kép là một cái tên phù hợp vì chúng được biểu diễn bằng số bit nhiều gấp đôi so với số chính xác đơn.

Để biết thông tin chi tiết về các biểu diễn dấu phẩy động, hãy đọc bài viết của David Goldberg , Điều mà mọi nhà khoa học máy tính nên biết về số học dấu phẩy động .

1 hữu ích 0 bình luận chia sẻ
1

Chúng được gọi là độ chính xác đơn và độ chính xác kép vì chúng liên quan đến kích thước tự nhiên (không chắc chắn về thuật ngữ) của bộ xử lý. Vì vậy, độ chính xác đơn của bộ xử lý 32 bit sẽ dài 32 bit và độ chính xác kép của nó sẽ gấp đôi - dài 64 bit. Họ vừa quyết định gọi kiểu chính xác đơn là "float" trong C.

1 hữu ích 1 bình luận chia sẻ
0

double là viết tắt của "độ chính xác kép". Tôi đoán là dài gấp đôi xuất phát từ việc không muốn thêm một từ khóa khác khi một loại dấu phẩy động với độ chính xác cao hơn bắt đầu xuất hiện trên bộ xử lý.

0 hữu ích 0 bình luận chia sẻ
0

Được rồi, về mặt lịch sử, đây là cách nó từng là:

Các máy ban đầu được sử dụng cho C có các từ 16 bit được chia thành 2 byte và ký tự là một byte. Địa chỉ là 16 bit, tương tự sizeof(foo*)là 2, sizeof(char)là 1. Một int là 16 bit, sizeof(int)cũng là 2. Sau đó, các máy VAX (địa chỉ mở rộng) xuất hiện và một địa chỉ là 32 bit. Một ký tự vẫn là 1 byte, nhưng sizeof(foo*)bây giờ là 4.

Có một số nhầm lẫn, điều này đã lắng xuống trong các trình biên dịch Berkeley để một đoạn ngắn bây giờ là 2 byte và một int là 4 byte, vì chúng rất phù hợp với mã hiệu quả. A dài trở thành 8 byte, bởi vì có một phương pháp định địa chỉ hiệu quả cho các khối 8 byte --- được gọi là các từ kép . Các khối 4 byte là các từ và chắc chắn, các khối 2 byte là các từ nửa vời .

Việc triển khai các số dấu phẩy động sao cho chúng phù hợp với các từ đơn hoặc từ kép. Để duy trì sự nhất quán, số dấu phẩy động của từ kép sau đó được gọi là "kép".

0 hữu ích 2 bình luận chia sẻ
0

Cần lưu ý rằng doubleKHÔNG phải có khả năng giữ các giá trị lớn hơn các giá trị của float; nó chỉ phải chính xác hơn .

0 hữu ích 2 bình luận chia sẻ
0

do đó% f cho kiểu float và% lf cho kiểu float dài giống như double.

0 hữu ích 1 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ c++ c floating-point history ieee-754 , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading