我正在学习一个开始的 C++ 类,而我的书(Starting Out with C++ Early Objects 7th edition)有一个非常糟糕的例子来说明如何检查浮点变量的值。
有问题的书籍示例(文件名 pr4-04.cpp):
// This program demonstrates how to safely test a floating-point number
// to see if it is, for all practical purposes, equal to some value.
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
double result = .666667 * 6.0;
// 2/3 of 6 should be 4 and, if you print result, 4 is displayed.
cout << "result = " << result << endl;
// However, internally result is NOT precisely equal to 4.
// So test to see if it is "close" to 4.
if (abs(result - 4.0 < .0001))
cout << "result DOES equal 4!" << endl;
else
cout << "result DOES NOT equal 4!" << endl;
return 0;
}
我在 Ubuntu 中使用 g++ 来编译我的代码,如下所示:
g++ pr4-04.cpp -o pr4-04 && ./pr4-04
我得到这个错误:
error: call of overloaded ‘abs(bool)’ is ambiguous
我可以通过将 abs() 更改为 fabs() 来解决这个问题,但这仍然非常令人困惑!为什么这本书给了我们无法编译的东西,或者这只是我?为什么“结果”的 cout 给出 4 而不是 4.000002?为什么这个值在 if{} 语句中使用时似乎会发生变化?
我知道我们不能只使用 == 来检查等价,但是为什么我需要使用绝对值呢?无论我是否使用它,我都会得到相同的答案。那么有什么意义呢?
更不用说,这似乎是检查浮点等价的一种非常糟糕的方法。有一个更好的方法吗?这个话题似乎非常重要。
我在stackoverflow上找到了这个主题,但是他们的解决方案:
fabs(f1 - f2) < precision-requirement
fabs(f1 - f2) < max(fabs(f1), fabs(f2)) * percentage-precision-requirement
就我的 4 章 C++ 经验而言,这对我来说没有多大意义。我将不胜感激一些帮助。我们的书给了我多达 6 句话来解释这一切。
编辑:根据一些人的建议,我试图找到一个勘误页面,但是在搜索教科书、互联网和我的课程网站 30 分钟后,我只能找到这个需要登录的可下载 zip 文件-_-
我也完美地复制了代码。那不是我的错字,我直接从带有代码的 CD 上复制了它。书中也是这样打的。