• ベストアンサー

どこがおかしいか教えてください。

以下のようなプログラム(書きかけ)を実行したら、下の(実行結果)のようになりました。 rad=deg+1;って書いたのに実行するとradが30のままなのはなぜなのでしょうか??教えてください #include <stdio.h> main() { double deg,rad; printf("sin degの値を計算します。\n"); printf("deg(角度)を入力せよ。:"); scanf("%d", &deg); printf("deg=%d\n",deg); printf("sin %d を計算します。\n",deg); rad=deg+1; printf("degをrad表示すると %d\n", rad); return(0); } (実行結果) sin degの値を計算します。 deg(角度)を入力せよ。:30 deg=30 sin 30 を計算します。 degをrad表示すると 30 Press any key to continue

質問者が選んだベストアンサー

  • ベストアンサー
  • yuntanach
  • ベストアンサー率72% (13/18)
回答No.3

tooukakuさんの思った通りにならない理由は、 doubleとintを混同しているからです。 scanf()で、double型のdegに%dでint型の数値を 読み込ませようとしています。そのため、degには doubleとしてはなにかでたらめな数値が入ってしまって います。 "press any key to continue"という表示がでた ということから、VisualStudioで実行したのだと、 つまりWindowsで、CPUはインテルだと勝手に想像 させてもらいます。 この場合、scanf()以前にはdegにはなにか初期化 されていない数値が入っているはずです。 この変数のメモリー上の64ビットのうち、scanf()で %dが指定されているので、下位32ビットの部分に 30が入ります。IEEE754だとこれは52ビットある 仮数部の下位32ビット分に相当しますので、 doubleの数値としてはほとんど変化がないでしょう。 次に、間違ってdoubleの下位32ビットへintの数値を 入れたわけなのに、printf()で%dでint型として 表示しています。degはprintf()で引数としては 64ビット分渡されているにも関わらず、printf()では そのうち下位32ビット分しかみていないわけです。 よって、入力した30が表示されます。 degにはでたらめな数値が入っていて、たまたま 間違いに間違いを重ねた結果一見して正しい表示を してしまっているわけです。 あとは、deg + 1が、たまたまdegの下位32ビットへ 影響がないような浮動小数演算になってしまって いたのでしょうか。おかげで、ふたたびradを 表示したら下位32ビットの部分をintとして表示 して30になったではないかと推測します。 正しくは、scanf()の%dを%lfにしてdouble型を 読み込むようにして、printf()の%dを%fにして double型を表示できるようにすることです。

tooukatu
質問者

お礼

詳しく解説ありがとうございます。

その他の回答 (2)

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.2

%d は整数値の入出力です。 scanf では %lf printf では %f か %g を使ってください。

tooukatu
質問者

お礼

ありがとうございます。

  • moritan2
  • ベストアンサー率25% (168/670)
回答No.1

浮動小数点数には、浮動小数点の書式指定を使わないといけませんね。

tooukatu
質問者

お礼

ありがとうございます。

関連するQ&A