2017-10-08 66 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內,而不是測試確切的不平等。