2010-11-25 12 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 

なぜナノが得られるのですか?float + float = NAN

+2

私は正しい(または少なくとも有効な)出力を得ました。実際のコードですか?そして、私はasin(0.5)= 0.5235 ... – Vladimir

+1

あなたのマシンで2番目のasin値は0.8ですか? Windowsでこれを実行していますか? :P – Bourne

+0

@Alexei、_actual_コードを投稿する必要があります。誰もが言っているように、それは大丈夫(他のプラットフォームでは間違いなく)うまくいくようです。 – paxdiablo

答えて

4

私はあなたの「たとえば」とは思わない。私は魔法を信じないから。両方の有効な浮動小数点数がどちらもかなり小さい場合、それらの合計は1ナノではありません。だから、私の推測はこれです:

|jk| > 10500または|ck| > 9500です。したがって、無効な(> 1.0または< -1.0)引数でasinを作成し、したがって、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)とあなたの合計の両方が正しくありません。確かにあなたはNaNを与える

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

は、あなたが実際に何かをしなかったことをあなたはよろしいです。


追加した情報に基づいて更新:あなたのコードはまだ私の環境では正常に動作します

#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/10500を変えわかりますjk = jk/10500には、整数divisioのために後者が0になったのでn、どちらの場合でもNaNは得られません。あなたは本当にプログラムを送信する必要があります。このプログラムは誤った動作を示しています。

+0

実際のコードで編集 –

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、私は返品がOKと思われます。