Rob*_*ert 2 c++ floating-point g++ cmath pearson
我正在编写一个开始的C++类,我的书(从C++ Early Objects第7版开始)有一个非常糟糕的例子,说明如何检查浮点变量的值.
有问题的书籍例子(文件名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;
}
Run Code Online (Sandbox Code Playgroud)
我在Ubuntu中使用g ++来编译我的代码,如下所示:
g++ pr4-04.cpp -o pr4-04 && ./pr4-04
Run Code Online (Sandbox Code Playgroud)
我收到这个错误:
error: call of overloaded ‘abs(bool)’ is ambiguous
Run Code Online (Sandbox Code Playgroud)
我能够通过将abs()更改为fabs()来解决这个问题,但这仍然令人困惑!为什么这本书给我们的东西不会编译,或者这只是我?为什么'结果'的cout给出4而不是4.000002?为什么在if {}语句中使用它时这个值似乎会改变?
我知道我们不能只使用==来检查等价,但为什么我需要使用绝对值?无论我是否使用它,我都会得到相同的答案.那有什么意义呢?
更不用说,这似乎是检查浮点等价的一种非常糟糕的方法.有一个更好的方法吗?这个话题似乎非常重要.
我在stackoverflow上找到了这个主题,但他们的解决方案:
fabs(f1 - f2) < precision-requirement
fabs(f1 - f2) < max(fabs(f1), fabs(f2)) * percentage-precision-requirement
Run Code Online (Sandbox Code Playgroud)
在我的4章C++经验的背景下对我没有多大意义.我非常感谢一些帮助.我们的书给了我一个高达6句话的文字来解释所有这些.
编辑:正如一些人建议我试图找到一个勘误页面,但在搜索教科书,互联网和我的课程网站30分钟后,我才能找到这个可下载的zip文件,需要登录-_-
我也完美地复制了代码.这不是我的错字,我直接从CD上复制了它的代码.它也在书中以这种方式输入.
if (abs(result - 4.0 < .0001))
Run Code Online (Sandbox Code Playgroud)
括号错了,你的意思可能是:if (abs(result-4.0) < .0001).
至于它为什么不编译,标准在§26.8p8中确定
除了数学函数的双重版本之外,C++还添加了这些函数的float和long double重载版本,具有相同的语义.
表达式(result-4.0 < .0001)产生a bool,并且没有abs带bool参数的重载,但是有多个版本abs的参数可以隐式转换bool.编译器没有找到比其他转换序列更好的转换序列之一,并且出现歧义错误.
| 归档时间: |
|
| 查看次数: |
280 次 |
| 最近记录: |