2016-04-26 19 views
5

tôi có chương trình sau đây:Kết quả so sánh gấp đôi và NaN là gì?

#include <iostream> 
#include <cmath> 

int main() { 
    double a = 1; 
    double b = nan(""); 

    std::cout << (a > b) << std::endl; 
    std::cout << (b > a) << std::endl; 

    return 0; 
} 

Output:

0 
0 

Nói chung từ ý nghĩa của nan-not a number rõ ràng là bất kỳ hoạt động với nan là bản chất vô nghĩa. Từ IEEE-754 mà tôi tìm thấy trên internet, tôi tìm thấy điều gì xảy ra nếu trong FPU ít nhất một toán hạng là nan kết quả cũng là nan, nhưng tôi không thấy gì về so sánh giữa giá trị thông thường và nan như trong ví dụ trên.

Tiêu chuẩn nói gì về nó?

+1

Chức năng FPU và kết quả logic của so sánh có thể là hai điều khác nhau. Việc tháo gỡ của bạn nói gì? – tadman

+0

Mã của bạn có thể (hoặc có thể không) bị thiếu so sánh '== '. Bạn đã kiểm tra '<' and '>' nhưng không kiểm tra '=='. Có thể bạn muốn sử dụng '<' and '> = 'hoặc' <=' and '>'. – jotik

Trả lời

7

Tiêu chuẩn nói gì về nó?

Tiêu chuẩn C++ không cho biết cách hoạt động của NaN hoạt động. Nó không được chỉ định. Vì vậy, như xa như C + + là có liên quan, bất kỳ kết quả là có thể và cho phép.

ANSI/IEEE Std 754-1985 nói:

5,7. So sánh

... Mọi NaN phải so sánh với mọi thứ, kể cả chính nó. ...

Điều gì không có thứ tự có nghĩa chính xác được hiển thị trong Bảng 4 trong cùng một phần. Nhưng trong ngắn hạn, điều này có nghĩa là so sánh sẽ trả về false, nếu bất kỳ toán hạng nào là NaN, ngoại trừ != sẽ trả về giá trị true.

+0

Có lẽ tôi đã không đọc nó đủ tốt. Cảm ơn! – Alex

1

0 ở đây có nghĩa là sai. Nan không bằng hoặc có thể so sánh với bất kỳ giá trị nào do đó kết quả của phép toán là sai (0).

+0

Những gì bạn nói là khá hợp lý, nhưng bạn có thể đưa ra bất kỳ tham chiếu nào trong đó nó được xác định. – Alex

2

Số 0 bạn đang thấy có nghĩa là false trong trường hợp này vì đó là luồng hiển thị cho sai theo mặc định. Nếu bạn muốn xem nó như là true hoặc false sử dụng std::boolalpha:

std::cout << std::boolalpha << (a > b) << std::endl; 

Whey so sánh các giá trị nổi điểm mà một trong những giá trị là nan sau đó x<y, x>y, x<=y, x>=y, và x==y tất cả sẽ đánh giá false, trong khi x!=y sẽ luôn đúng. Andrew Koenig có một bài viết hay về điều này trên trang web Dr Dobbs.

Khi bạn nghĩ về nó, kết quả không được là nan vì các toán tử so sánh cần trả về một boolean chỉ có thể có 2 trạng thái.

+0

Bạn có thể cung cấp bất kỳ tham chiếu nào mà hành vi này được xác định (tôi có nghĩa là hoạt động so sánh giữa NaN và bất kỳ giá trị bình thường nào khác)? – Alex

+0

@Alex - Tôi đã cung cấp liên kết tới một bài viết – Sean

0

Vâng, trên đầu trang của @ user2079303 câu trả lời khá tốt, có hai NaN: NaN tĩnh và tín hiệu NaN. Bạn có thể kiểm tra std::numeric_limits<T>::has_signaling_NaN trên nền tảng của bạn là tín hiệu NaN khả dụng.Nếu đó là sự thật và giá trị chứa std::numeric_limits<T>::signaling_NaN, sau đó

Khi một tín hiệu NaN được sử dụng như một tham số để một biểu thức số học, ngoại trừ dấu chấm động thích hợp có thể được nâng lên và NaN là "lắng", có nghĩa là, biểu thức trả về một NaN yên tĩnh.

Để thực sự có ngoại lệ FP, bạn có thể muốn đặt từ điều khiển FPU (cho đơn vị x87) hoặc thanh ghi MXCSR (cho đơn vị SSE2 +). Điều này đúng với nền tảng x86/x64, kiểm tra tài liệu nền tảng của bạn để có chức năng tương tự

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