2016-07-09 11 views
0

何も文字通り両方の変更で変わっていないので、すべてが同じであり、また、比較条件が変更されているCプログラムは異なる数値で異なる値を出力していますか?

#include<stdio.h> 
int main() 
{ 
    float x = 0.1; 
    if (x == 0.1) 
     printf("IF"); 
    else if (x == 0.1f) 
     printf("ELSE IF"); 
    else 
     printf("ELSE"); 
} 

そしてここ

#include<stdio.h> 

    int main() 
    { 
     float x = 0.5; 
     if (x == 0.5) 
      printf("IF"); 
     else if (x == 0.5f) 
      printf("ELSE IF"); 
     else 
      printf("ELSE"); 
    } 

我々は同様の結果を期待して、両方のプログラムから別のプログラム以下のプログラムを参照してください。それに対応して。

しかし2以上のプログラムは、あなたが2つのデータ型を使用している異なった結果

第一プログラム

ELSE 

なぜ、この2つのプログラムが異なっ

+0

あなたは 'floats'を比較しています。あなたは間違いなくこれを見てください:http://stackoverflow.com/questions/17404513/floating-point-equality-and-tolerances –

+0

http://stackoverflow.com/questions/37977151/what-happens-toも参照してください。 -the-a-l-on-a-lonに割り当てられたときの浮動小数点数の値/ 37977225#37977225 – Barmar

答えて

0

を動作している第二プログラム

IF 

を作ります:double、a​​utomaticly in
if(x=0.1)
(0.1は2倍)xはfloatです。これらのタイプは、値の格納方法が異なります。 0.1は0.1Fではない、それは0.100000000001(ダブル)または0.09388383(何か)

+0

いくつかの興味深いhttps://randomascii.wordpress.com/2012/02/25/comparing -floating-point-numbers-2012-edition/ – Alexandr

+0

ダブルまたはフロートのみを使用することをお勧めします – Alexandr

1

これら二つのプログラムの動作は、コンピュータとオペレーティングシステム間で異なります - あなたは正確な平等floatsのためにテストしています。

binaryにはfloatsがビット列として格納されます。つまり、バイナリ(0.1b)の0.1は小数点以下(0.5d)の0.5を表します。

同様

Binary | Decimal 
0.1 | 2^-1  = 1/2 
0.01 | 2^-2  = 1/4 
0.001 | 2^-3  = 1/8 
0.11 | 2^-1 + 2^-2 = 3/4 

問題は、一部の小数が素敵な浮動小数点表現を持っていないということです。 0.1d = 0.0001100110011001100110011 ... これは無限に長いです。だから、

、0.5はバイナリ

0.5d = 0.1000000000000000...b

が、0.1今、あなたのコンパイラに依存し、それは0.1Fがdoubleであると仮定してもよい

0.1d = 0.00011001100110011...

本当に厄介であるに本当にいいです0.0001100110011001100110011001100110011 ... の無限シーケンスの多くを格納するので、floatと同じではありません。イオンはずっと早く配列を切断する。

一方、小数点以下の桁数にかかわらず0.5fは同じです。最初の場所の後にすべてゼロがあるためです。

#defineにC++やCに float Sまたは double Sを比較する受け入れられな方法がある

非常に少ない数(私はEPSILONための短い、それはEPS呼びたい)と

float a = 0.1f 
if (a == 0.1f) { 
    printf("IF\n") 
} else { 
    printf("ELSE\n") 
} 

を置き換えます

#include <math.h> 

#define EPS 0.0000001f 

float a = 0.1f 
if (abs(a - 0.1f) < EPS) { 
    printf("IF\n") 
} else { 
    printf("ELSE\n") 
} 

効果的には、aが正確に等しいのではなく0.1fに近いかどうかをテストします。 99%のアプリケーションでは、このアプローチはうまくいきますが、超敏感な計算では、long doubleを使用するか、カスタムデータ型を定義するなどの奇抜なやり方が必要になります。

関連する問題