C C 浮點數比較問題

2021-07-08 19:01:09 字數 996 閱讀 6856

本系列文章由

@yhl_leo

never try to check two floating point variables for equality

c/c++ 浮點數比較是否相等時,有些細節必須要意識到,,例如下面的**:

#include 

using

namespace

std;

void main()

else

}

其輸出結果實際上是:

epsilon is: 0.001

d2-d1 is: 0.001

not equal!

為何會這樣呢?讓我們稍微調整一下上面的**:

cout

<<"epsilon is: "

<< setprecision(20) << epsilon<<"d2-d1 is: "

<< setprecision(20) << d2-d1 《可以得到:

epsilon is: 0.00100000000000000000

d2-d1 is: 0.00099999999999988987

這裡引出一條c/c++中非常重要的原則:

直譯過來意識就是,除了可以表示為2的冪次以及整數數乘的浮點數可以準確表示外,其餘的數的值都是近似值。

例如,1.5可以精確表示,因為1.5 = 3*2^(-1);然而3.6卻不能精確表示,因為它並不滿足這一規則。

此處的例子程式裡,這裡如果想要判斷這樣兩個浮點數,是否相等,採用==結果就會看似出乎意料,可以調整為:

if(abs(d2 - d1) < epsilon)

浮點數比較

在數 算當中經常會涉及到判斷兩個數是否相等的情況 對於整數很好處理 a b這樣的乙個語句就可以解決全部的問題 但是對於浮點數是不同的 首先,浮點數在計算機當中的二進位制表達方式就決定了大多數浮點數都是無法精確的表達的 現在的計算機大部分都是數字計算機,不是模擬機,數字機的離散化的資料表示方法自然無法...

浮點數比較

部分 思路來自網路。fxxki整理發布。double變數以帶符號的 ieee 64 位 8 個位元組 雙精度浮點數形式儲存 它可以表示十進位制的15或16位有效數字.負值取值範圍為 1.79769313486231570e 308 到 4.94065645841246544e 324,正值取值範圍為...

浮點數比較

0 我們來看乙個程式 include int main else 1 執行結果 可以看出,我們輸入的2.3和計算出來的 4.6 2 相等,這個沒有問題。但是如果遇到下面這個問題 3 我們再來看一段程式 include include define eqs 1e 8 define equal a,b ...