簡體   English   中英

比較C ++中的兩個float變量

[英]Compare two float variables in C++

我已經閱讀了多篇有關浮點變量比較的文章,但未能理解這些文章並從中獲得所需的知識。 所以,我在這里發布這個問題。

比較兩個float變量的好方法是什么? 下面是代碼片段:

#define EPSILON_VALUE 0.0000000000000001

bool cmpf(float A, float B)
{
  return (fabs(A - B) < EPSILON_VALUE);
}

int main()
{
  float a = 1.012345679, b = 1.012345678;

  if(cmpf(a, b))cout<<"same"<<endl;
  else cout<<"different"<<endl;

  return 0;
}

輸出: same盡管兩個float變量都具有不同的值。

沒有比較包含先前操作錯誤的浮點數的通用解決方案。 必須使用的代碼是特定於應用程序的。 因此,要獲得正確的答案,您必須更具體地描述您的情況。

潛在的問題是使用錯誤數據執行正確的計算通常是不可能的。 如果要計算兩個精確的數學值xy的某個函數,但您僅有的數據是一些不精確計算的值xy ,則通常無法計算出准確的結果。 , is, but you only know x is 3 and y is 4, but you do not know what the true, exact x and y are. 例如,假設您想知道x + 的總和是多少,但您只知道x為3而y為4,但是您不知道真正的確切xy是多少。 . 這樣就無法計算x +

如果知道xy分別近似於 xy ,則可以通過將xy相加來計算x + y的近似值。 當正在計算的函數(在此示例中為+ )具有合理的導數時,該工程便起作用:用合理的導數稍微更改函數的輸入會略微更改其輸出。 當您要計算的函數具有不連續性或較大的導數時,此操作將失敗。 例如,如果要使用近似值x計算x (在實際域中)的平方根,但由於先前的舍入誤差, x可能為負,則計算sqrt(x)可能會產生異常。 同樣,比較不平等或順序是一個不連續的函數:輸入的微小變化可以完全改變答案(從假到真,反之亦然)。

常見的壞建議是與“寬容”進行比較。 此方法將假陰性(如果比較精確的數學值,則不正確地拒絕滿足比較的數字)換為假陽性(不正確地接受不滿足比較的數字)。

適用對象是否可以接受錯誤接受取決於應用程序。 因此,沒有通用的解決方案。

設置的公差級別,甚至是計算公差的性質,都取決於數據,誤差和先前的計算。 因此,即使可以與公差進行比較,公差的使用量和計算方法也取決於應用程序。 沒有通用的解決方案。

輸出:相同,盡管兩個float變量都具有不同的值。

“浮點型變量具有不同的值。” 是沒有根據的。

因為即使初始化常數不同a,b值也same ,所以打印相同。


典型的float是32位,可以表示大約2 32個不同的值,例如1.0、1024.0、0.5、0.125。 這些值的形式均為:+/- some_integer * 2 some_integer

1.0123456791.012345678 不在float集中。 @Rudy Velthuis

1.012345 67165374755859375 // `float` member
1.012345 678
1.012345 679
1.012345 790863037109375   // `float` member

類似的適用於double ,但精度更高-通常為64位。

1.0123456791.012345678 都不在該double設置中

1.012345 67799999997106397131574340164661407470703125    // `double` member
1.012345 678
1.012345 6780000001931085762407747097313404083251953125  // `double` member
...
1.012345 6789999998317597373898024670779705047607421875  // `double` member
1.012345 679
1.012345 67900000005380434231483377516269683837890625    // `double` member

可以將其視為舍入的2個步驟。 代碼1.012345679會四舍五入為最接近的double精度數1.01234567900000005380434231483377516269683837890625。 然后,賦值將double float舍入為最接近的float 1.01234567165374755859375。

float a = 1.012345679;
// 'a' has the value of 1.01234567165374755859375

b 代碼1.012345678會四舍五入為最接近的double精度1.01234567799999997197106397131574340164661407470703125。 然后,賦值將double float舍入為最接近的float 1.01234567165374755859375。

flaot b = 1.012345678;
// 'b' has the value of 1.01234567165374755859375

ab具有相同的值。

這是因為浮點數的精度為7位。 如果要獲得更高的精度,則需要使用double或long double。

暫無
暫無

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

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