亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何做浮點比較?

如何做浮點比較?

如何做浮點比較?我目前正在編寫一些代碼,其中有如下內容:double a = SomeCalculation1();double b = SomeCalculation2();if (a < b)     DoSomething2();else if (a > b)     DoSomething3();然后在其他地方,我可能需要做平等:double a = SomeCalculation3();double b = SomeCalculation4();if (a == 0.0)    DoSomethingUseful(1 / a);if (b == 0.0)    return 0; // or something else here總之,我有很多浮點的數學,我需要做各種條件的比較。我不能把它轉換成整數數學,因為在這個上下文中,這樣的事情是沒有意義的。我以前讀過浮點比較可能是不可靠的,因為您可以這樣做:double a = 1.0 / 3.0;double b = a + a + a;if ((3 * a) != b)     Console.WriteLine("Oh no!");簡而言之,我想知道:如何可靠地比較浮點數(小于,大于等于)?我使用的數字范圍大概在10e-14到10E6之間,所以我確實需要處理小數字和大數字。我將此標記為語言不可知論者,因為無論我使用哪種語言,我都對如何實現這一目標感興趣。
查看完整描述

3 回答

?
守著星空守著你

TA貢獻1799條經驗 獲得超8個贊

比較更大/更小并不是一個真正的問題,除非你在浮動/雙精度限制的邊緣工作。

對于一個“模糊等于”的比較,這個(Java代碼,應該很容易適應)是我想出來的浮點指南經過大量的工作,并考慮到了大量的批評:

public static boolean nearlyEqual(float a, float b, float epsilon) {
    final float absA = Math.abs(a);
    final float absB = Math.abs(b);
    final float diff = Math.abs(a - b);

    if (a == b) { // shortcut, handles infinities
        return true;
    } else if (a == 0 || b == 0 || diff < Float.MIN_NORMAL) {
        // a or b is zero or both are extremely close to it
        // relative error is less meaningful here
        return diff < (epsilon * Float.MIN_NORMAL);
    } else { // use relative error
        return diff / (absA + absB) < epsilon;
    }}

它附帶了一個測試套件。您應該立即排除任何沒有的解決方案,因為在某些邊緣情況下,幾乎可以保證它會失敗,比如有一個值0,兩個與零相對的非常小的值,或者無窮大值。

另一種選擇(更多細節請參見上面的鏈接)是將浮點數的位模式轉換為整數,并接受固定整數距離內的所有內容。

在任何情況下,可能沒有任何解決方案是完美的所有應用程序。理想情況下,您應該使用包含實際用例的測試套件來開發/調整自己的應用程序。


查看完整回答
反對 回復 2019-06-19
?
月關寶盒

TA貢獻1772條經驗 獲得超5個贊

我有個比較浮點數的問題A < BA > B以下是似乎行之有效的方法:

if(A - B < Epsilon) && (fabs(A-B) > Epsilon){
    printf("A is less than B");}if (A - B > Epsilon) && (fabs(A-B) > Epsilon){
    printf("A is greater than B");}

晶圓廠-絕對值-照顧到它們是否本質上是平等的。


查看完整回答
反對 回復 2019-06-19
?
MM們

TA貢獻1886條經驗 獲得超2個贊

我們必須選擇一個公差級別來比較浮點數。例如,

final float TOLERANCE = 0.00001;if (Math.abs(f1 - f2) < TOLERANCE)
    Console.WriteLine("Oh yes!");

一個音符。你的例子很有趣。

double a = 1.0 / 3.0;double b = a + a + a;if (a != b)
    Console.WriteLine("Oh no!");

這里有些數學

a = 1/3b = 1/3 + 1/3 + 1/3 = 1.1/3 != 1

哦,是的.。

你是說

if (b != 1)
    Console.WriteLine("Oh no!")


查看完整回答
反對 回復 2019-06-19
  • 3 回答
  • 0 關注
  • 630 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號