2013-05-12 136 views
1

簡單C++代碼:爲什麼這種情況不會發生?

#include "../../std_lib_facilities.h" 
#include <float.h> 

double ctok(double c){ 
    const double koef_c_2_k = 274.15; 
    double k = c + koef_c_2_k; 
    if(k < -koef_c_2_k) error("Output abroad range of admissible values."); 
    return k; 
} 

int main(){ 
    cout << "Max double value: " << DBL_MAX << endl; 
    double c = 0; 
    cout << "Celsius: "; 
    cin >> c; 
    double k = ctok(c); 
    cout << "Kelvin: " << k << endl; 
    return 0; 
} 

輸出:

襯套@主機尼克斯:〜/ CPP/BS/5/5.2 $ ./a.out
最大雙值:1.79769 E + 308
攝氏:0
開爾文:274.15
襯套@主機尼克斯:〜/ CPP/BS/5/5.2 $ ./a.out
最大雙值:1.79769e + 308
攝氏: 100
開爾文:374.15
襯套@主機尼克斯:〜/ CPP/BS/5/5.2 $ ./a.out
最大雙值:1.79769e + 308
攝氏:-100
開爾文:174.15
襯套@主機尼克斯:〜/ CPP/BS/5/5.2 $ ./a.out
最大雙值:1.79769e + 308
攝氏:1.79769e + 308
開爾文:1.79769e + 308
bush @ host-nix:〜/ cpp/bs/5/5.2 $

在最後一種情況下,我設置了攝氏溫度的最大值,並且我等待了錯誤信息,但是我得到了錯誤的開爾文值。爲什麼發生?

謝謝。

+8

'1.79769e + 308' +'274.15'好像你正在向海洋中添加一杯水。 – deepmax 2013-05-12 07:45:10

+0

如果將值添加到double可以容納的最大值,您會發生什麼?這個非常大的值是否小於-274.15? – 2013-05-12 07:47:23

+0

如果我將**添加到** double **最大值,那麼我必須得到** double **的最小值。或者我不是對的? – 2013-05-12 07:51:37

回答

7

What Every Computer Scientist Should Know About Floating-Point Arithmetic

1.79769e+308 + 274.15看起來就像是增加了一杯水給海洋。

實數的精度是有限的,而你的比較在計算機世界中是不明智的。

您不能同時使用單個的double變量來處理非常小的和很大的數字。定義範圍,您的解決方案應該是微觀的或宏觀的。

+0

謝謝大家。我會閱讀這個鏈接。 – 2013-05-12 08:03:51

+1

這個價值在物質世界中也是不明智的。 – rodrigo 2013-05-12 08:37:27

+1

杯水?添加一個原子到已知的宇宙將不會遠程關閉:) – 2013-05-12 10:43:18

相關問題