为什么不发生这种情况?

时间:2013-05-12 07:39:08

标签: c++

简单的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
  衬套@主机尼克斯:〜/ CPP / BS / 5 / 5.2 $

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

谢谢。

1 个答案:

答案 0 :(得分:7)

What Every Computer Scientist Should Know About Floating-Point Arithmetic

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

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

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