2012-07-05 15 views
6

Tôi hơi ngạc nhiên (và sợ hãi) bởi thực tế rằng pragma warnings không phàn nàn về 'NaN' và 'nan' không phải là số.Tại sao số 'NaN' theo pragma cảnh báo?

Tại sao warnings không phát ra phong tục 'Argument isn't numeric in addition (+) cho họ?

Test Case

$ perl -Mstrict -wE 'say 0+$_ for qw/string NaN nan fail/;' 
Argument "string" isn't numeric in addition (+) at -e line 1. 
0 
0 
0 
Argument "fail" isn't numeric in addition (+) at -e line 1. 
0 
+3

http://en.wikipedia.org/wiki/NaN 'NaN' là giá trị hợp lệ của một số dấu phẩy động, giống như +/- vô cùng. – biziclop

Trả lời

10

Từ perlop

Binary "< =>" trả về -1, 0, hoặc 1 tùy thuộc vào việc trái đối số là số lượng ít hơn, bằng hoặc lớn hơn quyền tranh cãi. Nếu nền tảng của bạn hỗ trợ NaN (không phải một số) dưới dạng số giá trị, sử dụng chúng với "< =>" trả về undef. NaN không phải là "<", "==", ">", "< =" hoặc "> =" bất kỳ thứ gì (kể cả NaN), vì vậy, 5 số đó trả về false. NaN! = NaN trả về giá trị đúng, cũng như NaN! = Bất kỳ điều gì khác.

Nếu nền tảng của bạn không hỗ trợ Nans sau đó NaN chỉ là một chuỗi với giá trị số 0.

NaN cư xử khác nhau trên nền tảng khác nhau. Đó là một cách số vì nó có thể hoạt động như vậy trong các phép toán số. Nhưng nó cũng thực sự không phải là một con số vì nó có giá trị không xác định.

Hơn nữa hành vi của nó không phải là cầm tay như:

perl -E "say 'yes' if 0 == 'NaN'" 

có thể mang lại kết quả khác nhau trên nền tảng khác nhau, trừ khi bạn sử dụng Perl 5.22 hoặc mới hơn.

+0

Vì vậy, 'NaN' không phải là một số chỉ trong tên? Đằng sau hậu trường nó thực sự có một đại diện bằng số? – Zaid

+0

Xem câu trả lời được cập nhật. –

+3

@Zaid, NaN không phải là số theo bất kỳ định nghĩa thông thường nào, nhưng nó là một phao IEEE hợp lệ. – ikegami

-4

NaN là đối số của NiL trong chuỗi.

7

"Không phải là số" là tên dài cho giá trị được biểu thị thường xuyên nhất là "NaN". Xem thêm the wikipedia article. Máy tính với NaN thực sự có ý nghĩa (nó thậm chí có một biểu diễn mức bit thực tế trong IEEE754).