2016-08-01 18 views
16

Tính không đảo ngược của bộ phận dấu chấm động IEEE 754 là gì? Ý tôi là nó được đảm bảo bởi tiêu chuẩn rằng nếu double y = 1.0/x thì x == 1.0/y, tức là x có thể được khôi phục chính xác từng chút một?Tính không đảo ngược của phân chia điểm nổi IEEE 754

Các trường hợp khi yinfinity hoặc NaN là ngoại lệ hiển nhiên.

+4

Có những trường hợp rõ ràng nơi mà nó không thể, chẳng hạn như vô hạn và vô hạn, và có thể số không chuẩn hóa quá. Nhưng đó là một câu hỏi hay cho phần còn lại. –

+2

Có vẻ như điều này sẽ làm việc tốt cho không và vô cùng ... –

+0

Bằng ví dụ truy cập đơn giản, người ta có thể chỉ ra rằng một tương thích điểm nổi tương thích IEEE-754 không thể được hoàn nguyên theo cách này. Ví dụ, sử dụng chế độ làm tròn đến gần nhất hoặc thậm chí, với 'binary32':' x = 0x1.fffffep-1: 1.0f/x = 0x1.000002p + 0 1.0f/(1.0f/x) = 0x1. fffffcp-1' và với 'binary64':' x = 0x1.fffffffffffffp-1: 1.0f/x = 0x1.0000000000001p + 0 1.0f/(1.0f/x) = 0x1.ffffffffffffep-1' – njuffa

Trả lời

13

Có, có các giá trị độ chính xác kép (*) IEEE 754 xx != 1.0/(1.0/x).

Dễ dàng tạo ví dụ về giá trị bình thường với thuộc tính này bằng tay: một ví dụ được viết 0x1.fffffffffffffp0 trong C99's hexadecimal notation for floating-point values là như vậy mà 1.0/(1.0/0x1.fffffffffffffp0) == 0x1.ffffffffffffep0. Thật là tự nhiên khi mong đợi 0x1.fffffffffffffp0 là một ví dụ phản đối vì 1.0/0x1.fffffffffffffp0 rơi vào đầu một ô, nơi các số dấu phẩy động ít dày đặc hơn, do đó, một lỗi tương đối lớn hơn đã xảy ra ở phân chia bên trong nhất. Chính xác hơn, 1.0/0x1.fffffffffffffp0 rơi ngay trên điểm giữa giữa 0.5 và bộ kế thừa chính xác kép của nó, sao cho 1.0/0x1.fffffffffffffp0 được làm tròn lên thành người kế thừa là 0,5, với một lỗi tương đối lớn.

Ở định dạng số thập phân %.16e, 0x1.fffffffffffffp01.9999999999999998e+000x1.ffffffffffffep01.9999999999999996e+00.

(*) không có lý do cho hàm nghịch đảo có thuộc tính trong câu hỏi cho bất kỳ định dạng IEEE 754

+7

Một thực tế thú vị và dễ chứng minh ở đây là (giả định tràn và tràn, tránh được, định dạng nhị phân IEEE 754, nửa vòng, thậm chí, vv), bất kỳ float 'x' nào có phần nằm trong phạm vi' [1.0 , sqrt (2)] 'sẽ có thuộc tính là' 1.0/(1.0/x) == x'. –

-3

Rõ ràng là không. 1/10 không có đại diện. Thay vào đó, bạn nhận được một xấp xỉ. Đảo ngược sẽ không cung cấp cho bạn 10.

Chỉnh sửa: có một số lượng lớn trong số này. Bất kỳ nghịch đảo nào đòi hỏi nhiều hơn 53 bit sẽ là một trong số chúng.

Có một thử nghiệm dễ dàng. Trong C bạn có thể kiểm tra 1.0/(1.0/10.0) so với 10.0 và bạn sẽ khám phá ra chúng không bằng nhau.

+2

Điều này không đúng: http://coliru.stacked-crooked.com/a/c1c76fcf94b68e68 – plasmacel

+0

Điều gì không đúng? Đó là 0,1 không thể được đại diện hoặc đảo ngược những gì là không 0,1 sẽ không mang lại 10? Làm thế nào một thiết bị sẽ biết rằng (1/10) -eps được coi là 1/10 và không phải là xấp xỉ? – DAV

+0

Vì vậy, những gì sẽ đảo ngược 1/10 cho? –

Các vấn đề liên quan