Ruby chỉ theo dõi IEEE 754 Floating Point Standard. Trang Wikipedia đó không tệ khi giải thích những gì bạn đang thấy. Nhiều ngôn ngữ hiện đại có cùng cách tiếp cận.
Bằng trực giác, hành vi bạn thấy có ý nghĩa hoàn hảo. Nói chung,
1/<small number> = <big number>
Do đó trong giới hạn,
1/0 -> Infinity and similarly -1/0 -> -Infinity
Infinity
là một hằng số hiểu bởi hệ thống con dấu chấm động. Mặt khác,
0/<any non-zero> = 0
Vì vậy, chúng tôi có xung đột về 0/0. Nó có nên là số không hoặc vô cùng? Câu trả lời tiêu chuẩn IEEE là "Not a Number", số NaN
bạn đang thấy, một hằng số dấu phẩy động khác.
Hằng số NaN
và cộng hoặc trừ Infinity
tuyên truyền thông qua biểu thức theo cách có ý nghĩa. Ví dụ:
Infinity + <any (necessarly finite) number> = Infinity
và
<any number> + NaN = NaN
Và thú vị hơn:
1/Infinity = 0
nào bạn có thể thử tự hỏi:
irb(main):005:0> 1.0/(1.0/0.0)
=> 0.0
Theo cách này tính toán dấu chấm động có thể tiếp tục ngay cả khi nó đã tràn hoặc chia cho số không và vẫn tạo ra một câu trả lời hợp lý (mặc dù sau khi bạn biết tiêu chuẩn tốt, bạn sẽ thấy rằng dựa vào câu trả lời thường là một ý tưởng tồi).
Đây là hành vi duy nhất mà tiêu chuẩn cung cấp. Những người khác có thể được chọn. Nhưng Ruby làm điều này cho bạn. Tệp nguồn numeric.c, chức năng Init_Numeric
, thiết lập bộ xử lý máy chủ để phân chia bằng không truyền bá thông tin. Các ngôn ngữ khác có thể thực hiện các lựa chọn khác, ví dụ để tạo ra một ngoại lệ.
Nổi không giống như int. Có vẻ như bạn đã liệt kê các vấn đề. Những thứ như NaN và Infinity là điển hình cho phao nổi. –
@DaveNewton nhưng không có ngoại lệ nào được nêu ra trong trường hợp nổi, tại sao lại là trường hợp này? – ZX12R
Bởi vì nó không phải là một ngoại lệ khi giao dịch với số học dấu chấm động; có một giá trị được xác định rõ ('Infinity' hoặc' NaN'). Xem https://en.wikipedia.org/wiki/IEEE_floating_point#Exception_handling từ liên kết của Gene. –