私は初級の 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() に変更することでこれを修正できますが、それでも非常に紛らわしいです! なぜ本はコンパイルできないものを私たちに与えているのですか、それともこれは私だけですか? 「結果」のカウントが 4.000002 ではなく 4 になるのはなぜですか? if{} ステートメントで使用すると、この値が変化するように見えるのはなぜですか?
== を使用して等価性をチェックすることはできないと思いますが、なぜ絶対値を使用する必要があるのでしょうか? 使っても使わなくても答えは同じです。では、ポイントは何ですか?
言うまでもなく、これは浮動小数点の等価性をチェックする方法としては非常に貧弱に思えます。これを行うより良い方法はありますか?このトピックは非常に重要なようです。
私はこのトピックをstackoverflowで見つけましたが、その解決策は次のとおりです。
fabs(f1 - f2) < precision-requirement
fabs(f1 - f2) < max(fabs(f1), fabs(f2)) * percentage-precision-requirement
私の 4 つの章に相当する C++ の経験の文脈では、あまり意味がありません。助けていただければ幸いです。私たちの本は、これらすべてを説明するためになんと6文のテキストを私に与えてくれました.
編集:一部の人が示唆しているように、正誤表のページを見つけようとしましたが、教科書、インターネット、およびコースの Web サイトを 30 分検索した後、ログインが必要なこのダウンロード可能な zip ファイルしか見つけることができませんでした -_-
コードも完璧にコピーしました。これは私のタイプミスではありません。コードが入った CD から直接コピーしました。本にもそのように書かれています。