2017-10-08 41 views
0

我写了一个简单的函数,并希望知道assert宏在使用中。当我在第六个断言函数后测试函数(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

你的第一个断言是可行的,因为差异对于精度的工作来说太小了(浮点精度是有限的)。

这就是为什么你的第二个断言有效。

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

由于这个原因,测试不平等的花车通常检查一个小elipson内,而不是测试确切的不平等。