2012-02-21 41 views
5

Tôi đang cố gắng kiểm tra xem số std::complex là kết quả của một biến đổi ô nhiễm không (sử dụng http://fftw.org/) có chứa một số NaN trong phần thực hoặc tưởng tượng.Kiểm tra xem số phức có NaN

Tôi đang sử dụng Borland C++, vì vậy tôi không có quyền truy cập vào std::isnan. Tôi đã cố gắng để kiểm tra xem số là NaN bằng cách so sánh nó với bản thân:

(n.imag() != n.imag()) 

Tuy nhiên, ngay sau khi tôi gọi n.imag() hoặc std::imag(n), tôi nhận được một "hoạt động không hợp lệ điểm nổi".

Có cách nào để xác thực xem std::complex có tốt hay không; nếu nó có chứa một số NaN?

+5

Thay đổi trình biên dịch của bạn nếu nó không hỗ trợ 'std :: isnan'. – Nawaz

+0

Nawaz: Làm việc trên đó. Nhưng đó là một cơ sở mã lớn và tôi phải duy trì sản phẩm trong thời gian đó. – dagur

Trả lời

0

Tôi phát hiện ra rằng Borland có thư viện toán học riêng. Vì vậy, nếu bạn muốn tránh các lỗi dấu phẩy động, hãy sử dụng IsNan từ Borlands Math.

http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/[email protected]

+0

Để kiểm tra NaN trong một số phức, tôi phải thực hiện hack này ở Borland: :: phức tạp n; double a (n._Val [0]); double b (n.Val [1]); IsNan (a) || IsNan (b), trong đó IsNan được định nghĩa trong Math.hpp – dagur

4

này hoạt động trên g ++:

#include<iostream> 
#include<cmath> 
#include<complex> 

int main(){ 

    double x=sqrt(-1.); 
    std::complex<double> c(sqrt(-1.), 2.); 

    std::cout<<x<<"\n"; 
    std::cout<<c<<"\n"; 

    std::cout<< ((c!=c) ? "yup" : "nope")<<"\n"; 
} 
+0

Chỉnh sửa: Tính năng này hoạt động. Tôi đã thử này, và đây là đầu ra: + NAN (+ NAN, 2) nope – dagur

+0

@dagur: do đó, nó đã làm việc --- nó đã cho bạn biết 'yup' cho một số phức tạp đó là một NaN. Tui bỏ lỡ điều gì vậy? –

+0

Có, tôi đã chậm chỉnh sửa phản hồi của mình khi tôi nhận ra điều đó :). – dagur

0

fpclassify() trong math.h? Nó sẽ trả lại FP_NAN cho NaN. Hoặc tốt hơn là sử dụng isnan(). Nếu không có các hàm/macro như vậy, bạn có thể xem biểu diễn nhị phân của phao của bạn hoặc tăng gấp đôi và kiểm tra thủ công cho NaN. Xem các định dạng chính xác đơn và đôi IEEE-754 để biết chi tiết.

+0

fpclassify() dường như không tồn tại trong tiêu chuẩn Borland C++ sử dụng – dagur

1

Từ float.h tiêu đề

int _isnan(double d); 

Trả về một giá trị nonzero (TRUE) nếu giá trị thông qua tại là một NaN; nếu không nó sẽ trả về 0 (FALSE).

int _fpclass(double __d); 

Trả về giá trị số nguyên cho biết lớp dấu chấm động của đối số của nó. Các giá trị có thể được định nghĩa trong FLOAT.H (NaN, INF, v.v.)

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