gpt4 book ai didi

c++ - Understanding floating point variables and operators in c++(也可能是书上的错误)

转载 作者:太空狗 更新时间:2023-10-29 23:53:05 26 4
gpt4 key购买 nike

我正在学习 C++ 入门类(class),我的书(从 C++ 早期对象开始第 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;
}

我在 Ubuntu 中使用 g++ 来编译我的代码,如下所示:

g++ pr4-04.cpp -o pr4-04 && ./pr4-04

我得到这个错误:

error: call of overloaded ‘abs(bool)’ is ambiguous

我可以通过将 abs() 更改为 fabs() 来解决这个问题,但这仍然非常令人困惑!为什么这本书给了我们无法编译的东西,或者这只是我?为什么 'result' 的 cout 给出 4 而不是 4.000002?为什么这个值在 if{} 语句中使用时似乎发生了变化?

我知道我们不能只使用 == 来检查等价性,但为什么我需要使用绝对值?无论我是否使用它,我都会得到相同的答案。那有什么意义呢?

更不用说,这似乎是一种非常糟糕的检查浮点等价性的方法。有一个更好的方法吗? This topic seems awfully important .

我找到了 this topic在 stackoverflow 上,但他们的解决方案:

fabs(f1 - f2) < precision-requirement
fabs(f1 - f2) < max(fabs(f1), fabs(f2)) * percentage-precision-requirement

在我 4 章的 C++ 经验中,这对我来说意义不大。我将不胜感激一些帮助。我们的书给了我多达 6 句话的文字来解释所有这些。

编辑:根据一些人的建议,我试图找到一个勘误表页面,但在搜索教科书、互联网和我的类(class)网站 30 分钟后,我只能找到 this downloadable zip file。 , 这需要登录 -_-

我也完美复制了代码。那不是我的错字,我直接从带有代码的 CD 上复制了它。书上也是这样打的。

最佳答案

if (abs(result - 4.0 < .0001))

括号错了,你的意思可能是:if (abs(result-4.0) < .0001) .

至于为什么没有编译,标准在 §26.8p8 中确定

In addition to the double versions of the math functions in , C++ adds float and long double overloaded versions of these functions, with the same semantics.

表达式(result-4.0 < .0001)产生 bool ,并且没有重载 abs这需要 bool参数,但有多个版本的 abs其参数可从 bool 隐式转换.编译器没有找到比其余转换序列更好的转换序列之一,并因歧义错误而退出。

关于c++ - Understanding floating point variables and operators in c++(也可能是书上的错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12649478/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com