2012-01-28 25 views
3

私はこの単純なプログラムを実行しましたが、intからdoubleに変換すると結果はゼロになります。 0のsqrtは、負の値を表示します。これはオンラインチュートリアルの例ですので、なぜこれが起こっているのか分かりません。私はWindowsとUnixで試しました。intをdoubleに変換する

/* Hello World program */ 

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

main() 

{ int i; 

    printf("\t Number \t\t Square Root of Number\n\n"); 

    for (i=0; i<=360; ++i) 
     printf("\t %d \t\t\t %d \n",i, sqrt((double) i)); 


} 
+8

コードを投稿できますか? – hmjd

+3

問題のコードがなければ、これは有意義に答えられません。 –

+0

sqrtは負の値を返しません。あなたの問題は非常に深刻です。これに答えるためにコードを参照する必要があることを認識していないという事実は、あなたの根本的な問題です。私はあなたがコンピュータが同じことをすることができるとは思わないことを願っています! –

答えて

6

問題はprintfのフォーマットの誤使用である - 使用%グラム/%Fの代わりに%dの

ところで - あなたはあなたのコードはここで何をしたか疑問に思っているならば理解に役立つかもしれないいくつかの要約説明は次のとおりです。

printfルーチンは、sqrtの浮動小数点結果を整数として処理しました。符号付きの符号なし整数は、その基礎となるビット表現を持っています(単純に言えば、それらがメモリやレジスタなどでどのように符号化されているかです)。 printfの書式を指定することで、特定のメモリ領域/レジスタのビットパターンをどのように解読すべきかを指定します(呼び出し規約などに依存します)。例えば:

unsigned int myInt = 0xFFFFFFFF; 
printf("as signed=[%i] as unsigned=[%u]\n", myInt, myInt); 

を与える: "=署名したように、[ - 1]の符号なし= [4294967295]として" 後最初の符号なし符号付きとして使用されるが、扱わ

一方のビットパターン。あなたのコードにも同じことが適用されます。 printfに、sqrtの浮動小数点結果を整数として 'エンコード'するために使用されたビットパターンを処理するように指示しました。 single precision floating point encoding formatによると、 "4100万"

float myFloat = 8.0; 
printf("%08X\n", *((unsigned int*)&myFloat)); 

プリント:これを参照してください。 8.0は単純に(-1)^ 0 *(1 +分数= 0)* 2 ^(exp = 130-127)= 2 * 3 = 8.0ですが、ちょうど41000000(もちろん16進数)のように見えます。

+0

ありがとうございます。これがチュートリアルで気付かれないのは不思議です。私は%fを使用しましたが、今は正常に動作します。 – user994165

+0

このチュートリアルでは、浮動小数点値の%dを使用していませんでした。 –

+0

@David:チュートリアルや本などを一度も見たことがありませんか?それは起こる - 本当に。 – Artur

8

これは多分ですか?

int number; 
double dblNumber = (double)number; 
+0

これは確かに、数字を二重に変換する方法ですが、それは質問者の問題ではありません。 – Borealid

+8

奇妙なことに、彼の質問のタイトルは。しかたがない。 –

2

sqrt()リターンタイプdoubleの値。このような値は変換指定子"%d"で印刷できません。 sqrt()

これら二つの選択肢

 printf("\t %d \t\t\t %f \n",i, sqrt(i)); /* use "%f" */ 
     printf("\t %d \t\t\t %d \n",i, (int)sqrt(i)); /* cast to int */ 

のいずれかを試してみてくださいi引数は限り範囲でプロトタイプがあるとして、暗黙的にdoubleに変換されます。あなたが適切なヘッダーを含んでいるので、明示的な変換の必要はありません。

関連する問題