2016-05-26 32 views
1

我現在問這個問題,當我第一次問這個問題時,我不知道問題是什麼,但我知道我已經試過通讀浮點數學是否被破壞?以及爲什麼浮點數不準確?他們展示了問題的原因,但是我沒有真正看到在我寫的代碼中繞過這個問題,所以現在我詢問是否有任何機構知道我應該如何執行代碼以使程序正常工作。下面的代碼和描述編寫一個程序,確定兩個變量的值等於一個特定的值

這個程序背後的想法是它找到兩個雙打at的值,如果它們相乘,他們給出一個指定的值。因此,如果指定的值是4的程序必須找到的at,其中如果它們被乘以它會給4.變量t是在至10

的範圍爲5的值I寫了下面的代碼

int main(void) 
{ 
    double a = 0.01; 
    double t = 5; 
    while(1){ 
     if(t * a != 4){ 
      t = t + 0.01; 
      if(t > 10){ 
       t = 5; 
       a = a + 0.01; 
      } 
     } 
     else if (t * a == 4){ 
      break; 
     } 
    } 
    printf("%f %f", t, a); 
    return 0; 
} 

的代碼似乎沒有工作,如果我我嘗試使用0.01雖然它的工作原理,如果增量值是1。我知道發生這種情況的原因,但我會如何解決這個問題在此遞增值程序代碼還是有其他方法可以編寫代碼?該代碼似乎永遠循環

+4

請注意*「代碼似乎不起作用」*是不足以解決問題的。發生了什麼?你期望會發生什麼? – user694733

+2

什麼不起作用?你能說出你的期望和你的目標嗎? –

+0

't * a'可能永遠不會我_exactly_ 4.如果您已閱讀「是浮點數學中斷」文章,您應該知道這一點。 –

回答

3

而不是使用平等的每個值。

#include <math.h> 
#include <stdio.h> 

int main(void) 
{ 
    double a = 0.01; 
    double t = 5.0; 
    double epsilon = 0.000001; 
    while(1){ 
     if(fabs(t * a - 4.0) < epsilon){ 
      break; 
     } 
     else{ 
      t = t + 0.01; 
      if(t > 10){ 
       t = 5; 
       a = a + 0.01; 
      } 
     } 
    } 
    printf("%f %f %f", t, a, a*t); 
    return 0; 
} 

注意fabs(x - y) < epsilon相當於(y - epsilon) < x && x < (y + epsilon),所以你檢查x是否落在周圍y一個非常小的區間。

-1

如果a * t是4那麼a將是4/t。現在,如果t在5到10的範圍內並且可以取值5.1,5.2等,那麼a對於每個值t將具有相應的值。

即對於t = 5.1 = 0.78431

對於t = 5.2 = 0.7692。

您可以運行一個循環之間兩個雙打使用一個小的範圍內打印的數值爲t

t = 5.0; 
for (i=0; i<50; i++) 
{ 
    t += 0.1; 
    a = 4/t; 
    printf ("%f %f",a,t); 
} 
+0

雖然這個答案確實解決了這個特定問題,這類似於給OP一條魚,而不是教他們如何捕捉它。問題的關鍵在於如何確定FP等式的總體情況,而不是關於如何在給出5 <= t && t <10 && 0

相關問題