如何做浮點比較?我目前正在編寫一些代碼,其中有如下內容: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個贊
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; }}

月關寶盒
TA貢獻1772條經驗 獲得超5個贊
A < B
A > 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");}

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!")
添加回答
舉報
0/150
提交
取消