sap的面試題之一:
如何判斷兩個浮點數是否相等:
例1:a=1.000001 b=1.0兩個數,一般情況下會認為兩者相等。一般我們會認為寫出**:
例2:a=1000.0001 b=1000.000時,
顯然按照上面的程式,兩者並不相等,但是按照相對誤差(1000.001-1000.00)/1000.000=1.0e-6;所以應該認為兩者相等;
於是我們用相對誤差改寫**:
#include "stdafx.h"
#include#includeusing namespace std;
int main()
{ double a,b;
cout>b)
{ if(fabs(a-b)<=eps*fabs(a))//用相對誤差計算,看兩者是否相等;
{ cout<
但是當輸入:
a=0.0000 b=0.0001時,**//;if(fabs(a-b)<=eps*fabs(a))右端為0;左端不為0;顯然是不相等的,所以仍然不能全面判斷兩個浮點數是否相等;
比較好的方法是將相對誤差和絕對誤差相結合:
#include "stdafx.h"
#include#includeusing namespace std;
bool isequal(float a,float b ,const double eps,const double releps);
int main()
{ double a,b;
cout<
while(cin>>a>>b)
{ double eps=10e-9;//設定絕對誤差閾值,當兩個數絕對誤差很小很小的時候,就認為兩者相等;
double releps=10e-4;//設定相對誤差閾值,當兩個數的相對誤差很小的時候,認為相等
如何判斷乙個浮點數是否為0:
規則:
不可將浮點變數用「==」或「!=」與任何數字比較。
千萬要留意,無論是float 還是double 型別的變數,都有精度限制。所以一定要
避免將浮點變數用「==」或「!=」與數字比較,應該設法轉化成「>=」或「<=」形式。
假設浮點變數的名字為x,應當將
if (x == 0.0) // 隱含錯誤的比較
轉化為if ((x>=-epsinon) && (x<=epsinon))
其中epsinon 是允許的誤差(即精度)。
如何判斷兩個浮點數是否相等
眾所周知,在c c 語言中,兩個整形型別的數字是可以直接用 進行比較的,而兩個浮點型別的資料是不能直接用 符號進行比較的。不能直接進行比較的原因是 1.0000001 和 1.0 這兩個數在絕大多數的情況下,認為它們是相等的,所以經常能看到如下的 c 或者 c if fabs a b eps 0 一...
C 浮點數判斷相等的方法
先看下面一段 include using namespace std int main 看起來最後的執行結果都應該是 其實真正的執行結果都為 因為浮點數在計算機中並不能精確儲存,由於ieee浮點標準表示資料精度有限,浮點運算很容易造成微小的誤差,所以不能用等號判斷浮點數是否相等。採取的方法是設定乙個...
Java中比較兩個浮點數是否相等
public class test public static void isequaloffloat float a,float b 執行結果 使用 符號比較是否相等 true 使用 math.abs 方法比較是否相等 false 使用 math.abs 方法比較是否相等 比較寬容的限制 true...