2013-03-07 78 views
8

Tôi có một ứng dụng trong đó một vùng mã tạo ra các giá trị NAN. Tôi phải so sánh các giá trị cho bình đẳng và dựa trên đó thực hiện phần còn lại của code.How để so sánh hai giá trị NAN trong C + + cho bình đẳng?Cách so sánh hai giá trị NAN trong C++

Trả lời

17

Giả sử đại diện điểm nổi IEEE 754, bạn không thể so sánh hai giá trị NaN cho bình đẳng. NaN không bằng bất kỳ giá trị nào, kể cả chính nó. tuy nhiên bạn có thể kiểm tra nếu họ đều NaN với std::isnan từ <cmath> tiêu đề:

if (std::isnan(x) && std::isnan(y)) { 
    // ... 
} 

này chỉ có sẵn trong C++ 11, tuy nhiên. Trước C++ 11, Boost Math Toolkit cung cấp một số floating point classifiers. Ngoài ra, bạn có thể kiểm tra xem giá trị có phải là NaN hay không bằng cách so sánh giá trị đó với chính nó:

if (x != x && y != y) { 
    // ... 
} 

Vì NaN là giá trị duy nhất không bằng chính nó. Trong quá khứ, một số trình biên dịch đã làm hỏng điều này, nhưng tôi không chắc chắn về trạng thái tại thời điểm này (nó có vẻ hoạt động chính xác với GCC).

MSVC cung cấp chức năng _isnan.

Lựa chọn cuối cùng là giả sử bạn biết đại diện là IEEE 754 và thực hiện kiểm tra bit. Rõ ràng đây không phải là lựa chọn di động nhất.

+0

Tôi đã thêm giải pháp tăng cường làm câu trả lời khác. –

+0

@BartekBanachewicz Ah! Tôi vừa thêm nó vào của tôi nữa! –

+0

Cảm ơn mọi người. Tôi xin lỗi nếu câu hỏi không có ý nghĩa gì cả. Chỉ là háo hức muốn biết nếu đó là có thể. 'Chức năng của người đàn ông' sẽ làm điều gì đó cho trường hợp của tôi. – CodeRider

2

Bất kỳ NaN nhất định nào không bằng bất kỳ thứ gì, nó sẽ không bao giờ bằng NaN khác, vì vậy so sánh chúng với nhau là một bài tập vô ích.

Từ docs GNU:

NaN là không có thứ tự: nó không phải là bằng, lớn hơn, hoặc ít hơn bất cứ điều gì, kể cả chính nó. x == x là sai nếu giá trị của x là NaN. source

+1

@Aki erm, 0.0/0.0 là NaN. Tôi không thấy cái "ngược lại" ở đây là gì. –

3

Về tiền C++ 11, there's a boost for that, too.

#include <boost/math/special_functions/fpclassify.hpp> 

template <class T> 
bool isnan(T t); // NaN.