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;
}

输出:

bush@host-nix:~/cpp/bs/5/5.2$ ./a.out
最大双精度值:1.79769e+308
摄氏度:0
开尔文:274.15
bush@host-nix:~/cpp/bs/5/5.2 $ ./a.out
最大双精度值:1.79769e+308
摄氏度:100
开尔文: 374.15
bush@host-nix:~/cpp/bs/5/5.2$ ./a.out
最大双精度值:1.79769e+308
摄氏度:-100
开尔文:174.15
bush@host-nix:~/cpp/bs/5/5.2$ ./a.out
最大双精度值:1.79769e+308
摄氏度:1.79769e+308
开尔文:1.79769e+308
bush@host -nix:~/cpp/bs/5/5.2$

在最后一种情况下,我设置了摄氏度的最大值,我等待了错误消息,但我得到了错误的开尔文值。为什么会这样?

谢谢你。

4

1 回答 1

7

每个计算机科学家都应该知道的关于浮点运算的知识

1.79769e+308+274.15似乎你正在向海洋添加一杯水。

实数的精度是有限的,在计算机世界中你的比较是不明智的。

您不能double同时对非常小和非常大的数字使用单个变量。定义范围,您的解决方案应该是微观的或宏观的。

于 2013-05-12T07:52:13.300 回答