簡體   English   中英

了解c ++中的浮點變量和運算符(也可能是書籍錯誤)

[英]Understanding floating point variables and operators in c++ (Also a possible book error)

我正在編寫一個開始的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;
}

我在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上復制了它的代碼。 它也在書中以這種方式輸入。

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

括號錯了,你的意思是: if (abs(result-4.0) < .0001)

至於它為什么不編譯,標准在§26.8p8中確定

除了數學函數的雙重版本之外,C ++還添加了這些函數的float和long double重載版本,具有相同的語義。

表達式(result-4.0 < .0001)產生一個bool ,並且沒有帶有bool參數的abs重載,但是有多個版本的abs ,其參數可以從bool隱式轉換。 編譯器沒有找到比其他轉換序列更好的轉換序列之一,並且出現歧義錯誤。

問題顯然是這條線

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

應該寫成

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

我認為這是一個簡單的錯字。 將錯誤報告給本書的作者!

順便說一句,原始代碼在我的系統上編譯沒有任何問題,給出了預期的結果! 也就是說,即使作者測試了代碼,他也可能沒有注意到它是有問題的!

還回答了為什么需要abs()的問題:一些十進制數被四舍五入到浮點值,這個值略小於預期結果,而其他十進制數被四舍五入到稍大一些的數字。 在哪個方向上值是圓的(如果有的話:某些十進制數可以用二進制浮點精確表示)有點難以預測。 因此, result可能稍微大於或略小於期望和差異,因此分別為正或負。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM