2014-09-11 15 views
5

Tôi gặp phải một số hành vi kỳ quặc, ít nhất là trong tâm trí của riêng tôi, trong khi gỡ lỗi một số mã liên quan đến việc xác định nếu một hoạt động bổ sung sẽ chảy một đôi. Đây là một chương trình ví dụ thể hiện những gì tôi tìm thấy.Có lỗi trong numeric_limits hoặc tôi chỉ nhầm lẫn?

#include <iostream> 
#include <limits> 

using std::cout; 
using std::endl; 
using std::numeric_limits; 

int main() 
{ 
    double lowest = numeric_limits<double>::lowest(); 
    bool truth = (lowest + 10000) == lowest; 
    cout << truth << endl; 
} 

Khi tôi thực thi mã này, tôi nhận được kết quả là đúng. Đây có phải là một lỗi hoặc tôi chỉ ngủ thiếu?

Trả lời

15

Các đôi nhỏ nhất là:

-1.7976931348623157e+308 

Thêm 10.000, hoặc 1e4, điều này sẽ chỉ có tác động đáng kể nếu đôi có 300 chữ số chính xác, mà họ chắc chắn nhất thì không. Nhân đôi chỉ có thể chứa 15-17 chữ số có nghĩa.

Sự khác biệt về cường độ giữa hai con số này quá lớn đến mức việc thêm 10.000 không tạo ra số mới. Trên thực tế, số lượng tối thiểu là số lớn số lớn (để nói) mà bạn có thể thêm googol vào đó — đó là 1 theo sau là một trăm số không — và nó sẽ không thay đổi.

+0

OP (ví dụ: Matthew) hoàn toàn nên đọc http://floating-point-gui.de/ –

+1

@MatthewPapageorge cũng xem: [Định dạng điểm nổi chính xác kép] (http://en.wikipedia.org/ wiki/Double-precision_floating-point_format) – Rimas

+0

Cảm ơn bạn đã trả lời nhanh chóng và rõ ràng, John. Tôi rất trân trọng điều này. Cảm ơn Basile và Rimas cho tài liệu đọc. –