2010-11-25 94 views
2
float jk = 7700; float ck = 8000; - if i do int jk; I get rim=0; 

printf (asin(jk/10500)) = 1.57897 - for example 
printf (asin(ck/9500)) = 0.87868 - for example 

float rim; 
rim= asin(jk/10500)+ asin(ck/9500); 

printf("\n%f", rim) = nan 

爲什麼我得到nan?float + float = NAN

+2

我得到了正確的(或至少有效的)輸出,它是你的實際代碼?我有asin(0.5)= 0.5235 ... – Vladimir 2010-11-25 12:18:36

+1

第二個asin值是0.8在你的機器上?你在Windows上運行這個嗎? :P – Bourne 2010-11-25 12:21:14

回答

4

我不相信你的「例如」。因爲我不相信魔法。如果你有兩個有效的花車都很小,那麼他們的總和不是一個南。所以,我的猜測是:

要麼|jk| > 10500要麼|ck| > 9500。所以你用一個無效的(> 1.0或< -1.0)參數進行搜索,從而得到一個nan。

或者您犯了另一個錯誤。請發佈一個可編輯的可運行示例,它將打印NAN

4

您的代碼可能有問題,或者iPhone出現嚴重問題。下面的代碼:

#include<stdio.h> 
#include<math.h> 
int main (void) { 
    printf ("%f\n", asin(1)); 
    printf ("%f\n", asin(0.5)); 
    float rim; 
    rim = asin(1) + asin (0.5); 
    printf ("%f\n", rim); 
    return 0; 
} 

產生一個更明智的:

1.570796 
0.523599 
2.094395 

換句話說,無論你asin(0.5)和你的總和是不正確的。

你確定你實際上並沒有做這樣的事情:

rim = asin(1 + asin (0.5)); 

這的確給你的NaN。根據您的附加信息


更新:

您的代碼仍然工作在我的環境罰款:

#include<stdio.h> 
#include<math.h> 
int main (void) { 
    float jk = 7700; 
    //jk = 7700/10500; 
    jk = jk/10500; 
    printf ("%f\n", asin(jk)); 
    float hg = 8000; 
    hg = hg/9500; 
    printf ("%f\n", asin(hg)); 
    float rim; 
    rim = asin(jk) + asin (hg); 
    printf ("%f\n", rim); 
    return 0; 
} 

輸出:

0.823212 
1.001175 
1.824387 

你會發現我變了jk = 7700/10500jk = jk/10500由於後者給你0由於整數divisio ñ,但在任何一種情況下我都沒有得到NaN。你真的需要發佈一個完整的程序,它顯示了錯誤的行爲。

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

main() 
{ 
float jk=7700, ck=8000; 
printf ("\n%f",asin(jk/10500)); 
printf ("\n%f",asin(ck/9500)); 

float rim; 
rim= asin(jk/10500)+ asin(ck/9500); 

printf("\n%f", rim);// = nan 
} 

輸出

0.823212 
1.001175 
1.824387 
2

我覺得你的代碼是正確的。問題是jk和ck的價值。如果| jk/temp |> 1或| ck/temp |> 1,則返回asin(jk/temp)將爲nan。

所以儘量讓| jk/temp | < = 1和| ck/temp | < = 1,我相信回報會好的。