我代表一个“物理上不可能”的值,在计算机上可能代表的最负值。
#include <float.h>
double physically_impossible = -DBL_MAX;
这个测试效果很好
if( physically_impossible == -DBL_MAX )
cout << " OK, detected impossible value";
else
cout << " failed to detect impossible value";
cout << endl;
给予
OK, detected impossible value
但是当我尝试测试一个非常小但“物理上可能”的数字时,出现了可怕的错误。
double physically_impossible_plus_one = 1 - DBL_MAX;
cout << "physically_impossible " << physically_impossible << " physically_impossible_plus_one " << physically_impossible_plus_one;
if( physically_impossible < physically_impossible_plus_one )
cout << " OK, detected impossible value plus one";
else
cout << " failed to detect impossible value plus one";
cout << endl;
给予
physically_impossible -1.79769e+308 physically_impossible_plus_one -1.79769e+308 failed to detect impossible value plus one
正如 Karoly Horvath 指出的那样,由于精度有限,此方法失败了。我需要的是大于 -DBL_MAX 的最小负数
(动机:我想将数字(不是引发异常和触发断言的 NAN)划分为物理上可能的和物理上不可能的,同时尽量减少物理上可能数字的可用范围。)
最佳答案
浮点表示的精度有限。在 -1.79769e+308 上加一显然不会改变它。
这不是问题,不用担心。如果该值表示任何物理属性,那么,接近 DBL_MAX 意味着您正在做一些非常错误的事情。
关于c++ - 大于 -DBL_MAX 的最小负数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28138743/