And*_*yUK 9 c++ floating-point floating-accuracy
我想知道是否有办法克服精确度问题,这似乎是我的机器内部表示浮点数的结果:
为清楚起见,问题归纳为:
// str is "4.600"; atof( str ) is 4.5999999999999996
double mw = atof( str )
// The variables used in the columns calculation below are:
//
// mw = 4.5999999999999996
// p = 0.2
// g = 0.2
// h = 1 (integer)
int columns = (int) ( ( mw - ( h * 11 * p ) ) / ( ( h * 11 * p ) + g ) ) + 1;
Run Code Online (Sandbox Code Playgroud)
在转换为整数类型之前,列计算的结果是1.9999999999999996; 距离2.0的理想结果还差不多.
任何建议最受欢迎.
kmk*_*lan 15
当你使用浮点运算时,严格的相等几乎毫无意义.您通常希望与一系列可接受的值进行比较.
请注意,某些值不能完全表示为浮点线索.
了解每个计算机科学家应该知道的关于浮点运算和比较浮点数的内容.
MSa*_*ers 12
没有遗嘱问题.
您获得的结果(1.9999999999999996)与数学结果(2)的差异为1E-16.考虑到您的输入"4.600",这非常准确.
当然,你确实有一个舍入问题.C++中的默认舍入是截断; 你想要类似于Kip的解决方案.详细信息取决于您的确切域名,您期望round(-x)== - round(x)吗?
将浮点数舍入为整数的一种非常简单有效的方法:
int rounded = (int)(f + 0.5);
Run Code Online (Sandbox Code Playgroud)
注意:这仅在f始终为正时才有效。(感谢j随机黑客)
如果准确性非常重要,那么您应该考虑使用双精度浮点数而不仅仅是浮点数.虽然从你的问题看来你确实已经存在了.但是,检查特定值时仍然存在问题.你需要代码(假设你正在检查你的值为零):
if (abs(value) < epsilon)
{
// Do Stuff
}
Run Code Online (Sandbox Code Playgroud)
其中"epsilon"是一些小但非零的值.