• ベストアンサー

「割り算」 と 「分数の掛け算」

double型の変数にある値が代入されていて、 その数を半分にしようとしました。 演算部分を /2 としたらエラーが出てしまいました。 いろいろ試した結果、*0.5とすれば ちゃんと計算されるようなのですが、 どうしてこのようなことが起こるのか、よくわかりません。 どなたか、ご教授ください。よろしくお願いします。

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

  • ベストアンサー
  • qKAZp
  • ベストアンサー率47% (71/148)
回答No.3

>#define c 1 と言うことで、c は int の定数と判断されます >double b; で、格納する変数は double になっているのですが、 >b = c / 2; の右辺を見ると、 定数のintである1を、定数のintである2で割っているため、この文の結果はintになってしまいます。 本来なら0.5となるべきところですが、/ の両辺が int の場合は、結果を int で返しますので、0.5 の実数部分の0が結果となるわけです。 これを右辺の b に代入するときに 暗黙の型変換にてdouble として入れているのですが、すでに切り捨てられてしまった小数部分は帰ってこないわけですね。 2.0 とするとうまくいくのは、 / のどちらかが double の場合は、片方の int を暗黙に double に変換して double の結果を返すからですね。 演算式の、型変換について、もう一度ヘルプ等で調べて見てください。

funifuni11
質問者

お礼

なるほど、わかりました!! やはり型の考え方に問題があったんですね。 もう少し勉強しなければ、と痛感しました。 ありがとうございました。

その他の回答 (2)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

bcc32で #include <stdio.h> void main(void){ double x = 3.1415926; x = x / 2; printf("x=%f\n",x); } のようなテストをしてみましたが、エラーにはなりません。 どのような「演算」だったのでしょうか?

funifuni11
質問者

補足

お返事、ありがとうございます。 qKAZpさんへの補足にも書きましたが、 /2.0と書けばうまくいきました。 しかし、BLUEPIXYさんに頂いた回答にあるプログラムでは 確かにちゃんと計算されるようです。 この違いが起こる理由が分かりません。

  • qKAZp
  • ベストアンサー率47% (71/148)
回答No.1

どんなエラーがでたんでしょう? たとえば / 2.0 とかだとでないんじゃないですか?

funifuni11
質問者

補足

お返事、ありがとうございます。 すみません、言い方が間違っていました。 エラーが出たのではなく、計算結果がゼロになってしまったのです。 おっしゃるとおり、/2.0にしたら正しい計算結果が出てきました。 なぜ、2ではダメで2.0だとOKなのでしょうか? 整数型と実数型の違いなのでしょうか? そのあたりがよくわかりません。 ちなみに、元のプログラムは #include <stdio.h> #define c 1 void main(){    double b;    b = c / 2;    printf("%f\n", b); } です。補足が長くなって申し訳ありません。

関連するQ&A

  • 分数の掛け算・割り算の3つの数の計算の仕方を・・

    分数のかけ算・わり算の3つの数の計算の仕方を忘れてしまいましたので教えてほしいです (1)○÷○÷○、(2)○×○÷○、(3)○÷○×○、(4)○×○×○ この4つすべての計算の仕方教えてくだされば幸いです。(○の部分の分数は何でもいいです) よろしくお願いします

  • 掛け算について

    いつもお世話になります。 変数サイズと掛け算について教えてください。 下記の2通りの変数の場合、 (1)int test = 307600000 * 8; (2)int test = 2460800000; (1)は、整数定数がオーバーフローしましたというエラーになり、 (2)はエラーになりません。(2)の値は(1)の掛け算の結果です。 質問は、 1.なぜ(1)はダメなのか? 2.(1)をエラーをなくすにはどの変数型宣言をしなければならないのか? よろしくお願い致します。

  • Perlインクリメントデクリメント

    あっていますでしょうか? インクリメント演算子とデクリメント演算子 インクリメント(加算)演算子は変数の数値を一つ増やす。 デクリメント(減算)演算子は変数の数値を一つ減らす。 ++ インクリメント演算子 変数の値を1増やす $a++ ++$a $aの値を1増やす -- デクリメント演算子 変数の値を1減らす $a-- --$a $aの値を1減らす $a=1; 変数$aに1を代入する print "はじめは$aでした。\n"; $aの代わりに1が入り はじめは1でした。と表示する。 $a++; $aに1を足す。 print "1増えて$aになりました。\n"; $aの代わりに2が入り、1増えて2になりました。 と表示する。 $a--; $aから1減らす。 print "1減って$aに戻りました。\n"; $aの代わりに1を入れて 1減って1に戻りました。 と表示する ↓ 実行結果 ↓ はじめは1でした。 1増えて2になりました。 1減って1に戻りました。 $a++ と ++$a の違い インクリメント演算子、デクリメント演算子には2通りの書き方があります。 ++$a(前置)と$a++(後置) --$a(前置)と$a--(後置) 前置の場合は変数の参照より先に演算が行われます。 後置の場合は変数の参照より後に演算が行われます。 $x=$a=1; 変数$xと$aに1を代入する。 $x=++$a; $aに1を足した後に$xに代入する。$xの値は2になる。 $x=$a=1; 変数$xと$aに1を代入する。 $x=$a++; 変数$aの値を$xに代入した後に$aに1を足す。$xの値は1。 文字もインクリメント出来ます。 $x="A"; "A"を$xに代入する。 $x=++$x; Aから一つ増やしてBにして$xに代入する。 $x="aaa"; "aaa"を$xに代入する。 "aaa"を一つ増やして"aab"を$xに代入する。 ただし、文字のデクリメントはできません。

    • ベストアンサー
    • Perl
  • フォームのテキストコントロールに代入された計算式を計算したい

    VB.Netのイベントで、フォームのテキストコントロールに代入された計算式を計算したいのです。 (String変数に代入された値でも構いません) 計算式.textに "3*4+5"等の計算式が代入されているとします。 これを計算して結果を変数に代入させたいのですが、Textになっているので、どうすればよいか分かりません。 よい方法を教えて下さい。

  • 文字を整数として扱う場合の演算について質問

    javaの参考書に、文字を整数として扱う場合の演算についての解説があり、疑問点があったので質問します。 質問1:何故char型の変数は、キャストしなくてもint型のリテラルを代入することができるのか?      例えば、 以下の演算はキャストしなくてもこのまま代入できます。 char ch='a'; ch=98; でも、以下の演算はキャストしていないのでエラーになります。      char ch='a'; ch=ch+1; これは何故ですか?参考書に記載されていた理由として、「byte,char,short、 これ等の型の変数や値を使って計算すると、それ等は一度intに直して計算されるから」というような趣旨の事が書いてありました。 つまり、char型の変数には、キャストしない限りint型の数値を代入できないということですよね? でも前者のソースコードは、chはchar型であるにもかかわらず、int型のリテラル98を代入できています。 これは何故ですか? 質問2:javaの参考書に、インクリメント・デクリメント演算子と複合代入演算子は、型を保存するという解説がありました。これはどういう意味ですか? 僕の仮説では、例えば、      char ch='a';      ch+=5; であれば、5は、char型のまま代入されるということでしょうか?

    • ベストアンサー
    • Java
  • 複数の演算子を選択する場合の処理

    複数の演算子を選択するプログラムがあり、選択する演算子によって計算方法を変えたいのですが、このときに今やっている方法はifの条件分岐にて処理を行っておりますが、演算子は変数に代入できないのでしょうか? 例えばべき乗を選択した場合は 変数= ^ また、これと同じく代入演算子の場合も 変数= ^= という方法があれば教えていただきたいです。 よろしくお願いいたします。

  • 割り算

    ダブル型で316.95/3.0をすると、105.65という答えがほしいのですが、結果が105.6499999・・・となってしまいます。 きちんと計算できる方法を教えていただけますでしょうか。 おねがいします。

    • ベストアンサー
    • Java
  • 2進数データのビット演算

    vb.netにて 0と1からなる2進数で記録した2つの値をビット演算したいと思っております。 Convert.ToInt32("1111101000", 2) などを使って、一度数値に変換して演算すれば、計算可能なことはわかったのですが、計算に利用したいデータが2進数で1000桁ほどあります。桁数が多い場合、Convert.ToInt32ではエラーが出て実行できません。 無数に長い2進数のデータをビット演算するにはどうすればよろしいでしょうか。 ご存知の方、ご教授よろしくお願いいたします。

  • どなたか、教えて下さい

    4つの変数a, a1, b, b1(全てint 型)に対して次の演算を実行します a に0 を代入 b に1 を代入 a1 = ~a b1 = ~b その後、4つの変数の値を10進数で表示するプログラムを書いてください。 この問題の考え方を教えて下さい!講習で必ず受ける必要がある講座だったのですが、 全く分からないので考え方をどなたか教えて下さい。宜しくお願いします。

  • エクセルで数式に値を代入して一度に計算をする方法

    実験でu={kb(cosθ)(sinh2θ)^2}/{v(sinθ)^2(4πρr^2)}という式に各測定値を入れて計算結果を表にしたいのですが、θをほんの少しずつ変化させていったためデータ数が50個くらいあります。さらにまたrも少しずつ変化させていった場合のデータも取ったのでデータ数がかなり多いです。地道にu={kb(cosθ)(sinh2θ)^2}/{v(sinθ)^2(4πρr^2)}に変数をそれぞれ代入していけば良いのですが、データ量があまりに膨大なので出来るだけそれは避けたいです。 例えばエクセルでAの行にθ=0.5,1.0,1.5,...と変数、Bの行にそれに対応した値をuに代入した時の計算結果という感じに、θに値を入れればsinθなど全てのθの関数に値を一度に代入して計算をしてくれて表にする方法はありますか?Mathmaticaなどエクセル以外でも構いません。データ量が多くても複雑な計算をする手間が省ける良いやり方を知っている方がいればどなたか教えて下さい。お願いします。

専門家に質問してみよう