2013-08-08 77 views
50

Tôi đã đọc về dấu phẩy động và tôi hiểu rằng NaN có thể là kết quả từ các hoạt động. nhưng tôi không thể hiểu chính xác những khái niệm này là gì. Sự khác biệt là gì?Sự khác nhau giữa NaN tĩnh và tín hiệu NaN là gì?

Sản phẩm nào có thể được sản xuất trong khi lập trình C++? Là một lập trình viên, tôi có thể viết một chương trình gây ra một sNaN không?

Trả lời

37

Khi kết quả hoạt động trong một NaN yên tĩnh, không có dấu hiệu cho thấy bất kỳ điều gì bất thường cho đến khi chương trình kiểm tra kết quả và thấy NaN. Tức là, tính toán tiếp tục mà không có bất kỳ tín hiệu nào từ đơn vị dấu chấm động (FPU) hoặc thư viện nếu dấu phẩy động được thực hiện trong phần mềm. Một tín hiệu NaN sẽ tạo ra một tín hiệu, thường ở dạng ngoại lệ từ FPU. Cho dù ngoại lệ được ném tùy thuộc vào tình trạng của FPU.

C++ 11 thêm một vài ngôn ngữ controls over the floating-point environment và cung cấp standardized ways to create and test for NaNs. Tuy nhiên, cho dù các điều khiển được thực hiện không được chuẩn hóa tốt và ngoại lệ dấu phẩy động thường không bị bắt theo cùng một cách như các ngoại lệ C++ chuẩn.

Trong các hệ thống POSIX/Unix, ngoại lệ dấu phẩy động thường bị bắt bằng cách sử dụng trình xử lý cho SIGFPE.

+20

Thêm vào điều này: Nói chung, mục đích của một tín hiệu NaN (sNaN) là để gỡ lỗi. Ví dụ, các đối tượng dấu chấm động có thể được khởi tạo thành sNaN. Sau đó, nếu chương trình không thành công với một giá trị trước khi sử dụng nó, một ngoại lệ sẽ xảy ra khi chương trình sử dụng sNaN trong một phép tính số học. Một chương trình sẽ không tạo ra một sNaN vô ý; không có hoạt động bình thường nào tạo ra sNaNs. Chúng chỉ được tạo ra đặc biệt cho mục đích có một tín hiệu NaN, không phải là kết quả của bất kỳ số học nào. –

+8

Ngược lại, NaN là để lập trình bình thường hơn. Chúng có thể được tạo ra bởi các hoạt động bình thường khi không có kết quả bằng số (ví dụ: lấy căn bậc hai của một số âm khi kết quả phải là số thực). Mục đích của họ nói chung là cho phép số học tiến hành một cách bình thường. Ví dụ: bạn có thể có một số lượng lớn các số, một số biểu thị các trường hợp đặc biệt không thể xử lý bình thường. Bạn có thể gọi một hàm phức tạp để xử lý mảng này và nó có thể hoạt động trên mảng với số học thông thường, bỏ qua các NaN. Sau khi nó kết thúc, bạn sẽ tách các trường hợp đặc biệt để có thêm công việc. –

+0

@wrdieter Cảm ơn bạn, sau đó chỉ có sự khác biệt lớn là tạo ra ngoại lệ hay không. – JalalJaberi

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