Một điều tôi muốn nhìn thấy sẽ là một sự công nhận rằng double
để float
nên được coi là một sự chuyển đổi mở rộng, trong khi float
để double
được thu hẹp (*). Điều đó có vẻ phản trực giác, nhưng hãy xem xét các loại thực sự có nghĩa là gì:
- 0,1f có nghĩa là "13,421,773,5 / 134,217,728, cộng hoặc trừ 1 / 268,435,456 hoặc hơn".
- 0,1 thực sự có nghĩa là 3,602,879,701,896,394 / 36,028,797,018,963,968, cộng hoặc trừ 1 / 72,057,594,037,927,936 hoặc hơn "
Nếu một người có double
đại diện tốt nhất cho đại lượng "một phần mười" và chuyển đổi nó thành float
, kết quả sẽ là "13,421,773,5 / 134,217,728, cộng hoặc trừ 1 / 268,435,456 hoặc hơn", đó là mô tả chính xác của giá trị.
Ngược lại, nếu một người có float
đại diện tốt nhất cho đại lượng "một phần mười" và chuyển đổi nó thành double
, kết quả sẽ là "13,421,773,5 / 134,217,728, cộng hoặc trừ 1 / 72,057,594,037,927,936 hoặc hơn" - một mức độ chính xác ngụ ý đó là sai bởi một yếu tố của hơn 53 triệu.
Mặc dù tiêu chuẩn IEEE-744 yêu cầu các phép toán dấu phẩy động phải được thực hiện như thể mọi số dấu phẩy động đại diện cho số lượng chính xác chính xác ở trung tâm của phạm vi của nó, điều đó không nên dùng để ám chỉ rằng các giá trị dấu phẩy động thực sự đại diện cho chính xác số lượng. Thay vào đó, yêu cầu rằng các giá trị được giả định là ở giữa phạm vi của chúng bắt nguồn từ ba sự kiện: (1) tính toán phải được thực hiện như thể các toán hạng có một số giá trị chính xác cụ thể; (2) các giả định nhất quán và được ghi lại là hữu ích hơn so với các giả định không nhất quán hoặc không có giấy tờ; (3) nếu một người sẽ đưa ra một giả định nhất quán, không có giả định nhất quán nào khác có thể tốt hơn giả định một đại lượng đại diện cho trung tâm của phạm vi của nó.
Tình cờ, tôi nhớ khoảng 25 năm trước, một người nào đó đã nghĩ ra một gói số cho C sử dụng "các loại phạm vi", mỗi loại bao gồm một cặp phao 128 bit; tất cả các tính toán sẽ được thực hiện theo cách tính toán giá trị tối thiểu và tối đa có thể cho mỗi kết quả. Nếu một người thực hiện một phép tính lặp dài lớn và đưa ra giá trị [12.53401391134 12.53902812673], người ta có thể tin tưởng rằng trong khi nhiều chữ số chính xác bị mất cho các lỗi làm tròn, kết quả vẫn có thể được biểu thị một cách hợp lý là 12,54 (và nó không phải là ' t thực sự 12,9 hoặc 53,2). Tôi ngạc nhiên tôi chưa thấy bất kỳ sự hỗ trợ nào cho các loại như vậy trong bất kỳ ngôn ngữ chính nào, đặc biệt là vì chúng có vẻ phù hợp với các đơn vị toán học có thể hoạt động song song trên nhiều giá trị.
(*) Trong thực tế, thường hữu ích khi sử dụng các giá trị độ chính xác kép để giữ các tính toán trung gian khi làm việc với các số chính xác đơn, do đó việc phải sử dụng một kiểu chữ cho tất cả các hoạt động như vậy có thể gây khó chịu. Các ngôn ngữ có thể giúp đỡ bằng cách có loại "mờ đôi", sẽ thực hiện tính toán thành gấp đôi và có thể được tự do chuyển sang và từ đơn; điều này đặc biệt hữu ích nếu các hàm lấy tham số loại double
và trả về double
có thể được đánh dấu để chúng tự động tạo ra quá tải chấp nhận và trả về "mờ gấp đôi".