2017-10-08 12 views
0

私は単純な関数を書いて、使用中のアサートマクロを知りたいと思います。 6番目のアサート関数の後に関数(moving_hysteresis)をテストすると、アボートが発生し、なぜそれを見つけることができませんでした。 moving_hysteresis()関数は、次のとおりです。負の浮動小数点を使用したCでのアサート

float moving_hysteresis(float Delta,float temp) 
{  
float delta=Delta; 
float temp_min=ZERO; 
float temp_max=delta; 
float result; 

if(temp<=temp_max) 
    { 
     if(temp>=temp_min) 
      { 
       result=temp; 
       return result; 
      } 
     else 
      { 
       result=temp+delta; 
       return result; 
      } 
    } 
else 
    { 
     result=temp-delta; 
     return result; 
    } 
} 

私は

assert(moving_hsysteresis(5.00,-5.01)==(float)-0.01); 

でこれをテストしようとした場合、私はアサーションを取得し、私がしようとした場合、私は、例えば、なぜ... を見つけることができませんでしたこれでテストしてください。

assert(moving_hsysteresis(5.00,-2.36)==(float)2.64); 

正しく動作します。誰か考えている?

+0

正確な浮動小数点値のテストは、ほとんど常に悪い考えです。 –

+0

ご協力いただき、ありがとうございました!今私にとっては明らかです! –

答えて

0

最初のアサーションは、精度が動作するには小さすぎます(浮動小数点精度は制限されているため)。

あなたの2番目のアサーションが機能する理由です。

1

次のコードコンパイルする場合:

#include <stdio.h> 
int main() { 
    float a=5.00; 
    float b=5.01; 
    float c=0.01; 
    printf("%.25f",a-b+c); 
} 

を値は数学的にゼロにする必要がありますが、浮動小数点エラーは、結果が正確にゼロにはならないだろうということを意味します。私のシステムでは、これは-0.0000002291053533554077148を出力します。

このため、不等式のための浮動小数点数のテストでは、通常、正確な不等式のテストではなく小さなエリプソンプ内でのチェックが行われます。

関連する問題