• ベストアンサー

VC++6.0 long型とdouble型の掛け算

VC++6.0 long型とdouble型の掛け算について ----------------------------- long lAnser; long lHoge = 100; double dHoge = 1.15; lAnser = lHoge * dHoge; ------------------------------ 上記のように演算したところ lAnserは「114」になりました。 なぜ、「115」にならないのでしょうか? また、どうすれば「115」になるのでしょうか? ご教授よろしくお願いします。

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

  • ベストアンサー
回答No.1

double型では、1.15という数値は厳密に表すことができません。 計算機内部では"1.1499999999999999"と表現されます。 (浮動小数点型がどのように扱われるかは、参考URLからたどってみてください) すなわち、 lHoge * dHoge はの答えは "114.99999999999999" となります。 小数を含む数値を整数型の変数に代入する際には、小数点以下は切り捨てられますので、 結果 lAnswer には "114" が入ります。 この性質を利用して、計算結果の四捨五入は  lAnswer = lHoge * dHoge + 0.5 という式で可能ですが、誤差の根本解決にはなりません。 誤差が許されない場面では、通常double, float型(浮動小数点型)は使用しません。 このような場面では、多倍長固定小数点を用いることが多いかと思います。(googleでしらべてみてください) でわ。

参考URL:
http://www.google.com/search?num=50&hl=ja&q=%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9+double%E5%9E%8B+%E8%AA%A4%E5%B
noname#59240
質問者

お礼

ご回答ありがとうございます double, float型では正確な計算ができないのですね 勉強になりました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • bacet14
  • ベストアンサー率50% (7/14)
回答No.2

まず、異なる型の演算の場合は「強い」型に統一されます。「強さ」は char<short≦int≦long<float<double だったと思います。 従って lHoge * dHoge はdouble型で計算されることになり、2進数での記録方法からNo.1さんがおっしゃるように114.99999999…みたいな数になります。具体的な値は printf("%.30f", lHoge * dHoge); のようにして見て下さい。有効な桁は16桁程度ですが。 解決方法の第2弾として、dHogeの値が例えば115%のつもりなら lHoge = 100; // 任意の数 dHoge = 115; // パーセンテージ lAnswer = lHoge * dHoge / 100; なんていう、似非分数もあります。

noname#59240
質問者

お礼

ご回答ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VC6でlong longでエラー?

    VC++6で、void test(unsigned long long a){} の場所で、error C2632: 'long' と 'long' の 2 つの型指定子のあいだにコードがありません。というエラーが発生します。 unsigned long longはVCで動作するものでしょうか?

  • VCでキャストに失敗する

    double ddd; double ddd2; long lll; long lll2; ddd = -3.038; ddd = ddd*10000.0; ddd2 = -30380.0; lll=(long)ddd; lll2=(long)ddd2; 上記のような処理をした場合に lllは-30379になり lll2は正しい-30380になります。 なぜlllでは-1されてしまうのでしょうか? どなたかお教えください、よろしくお願いします。 コンパイル環境はVC6.0 OSはWomdowsNT SP6です。

  • 掛け算演算を使わない掛け算

    java初心者です。 2つの正の整数を入力して、それらを掛け合わせた答えを表示したのですが、 掛け算演算を使わないということになると、どういうソースを書けばいいんでしょうか。

    • ベストアンサー
    • Java
  • long doubleの有効桁数を教えてください。

    long doubleの有効桁数を教えてください。 環境で一概に言えないと思いますが、 私の環境では、sizeof(long double)で12バイトです。 OS Windows Vista(32bit) GCC minGW よろしくお願いします。

  • DoubleとLongの範囲

    お世話になります、 DoubleとLong型ではどちらのほうが有効範囲が広いのでしょうか? よろしくお願いします。

  • VC++2008にてdouble型の置換について

    現在VC++2008をMFCにて開発しております。VC++は初心者です。 画面から入力される値(小数点以下有り)を ファイル名として利用し出力する為 小数点とマイナスを特定の文字列に置換する処理をおこなっております。 画面から入力される値(CString)をそのままatof変換し、 double型で取得しますと 「3000.00000」のような値になってしまいます。 「3000.10100」のような値も入力される可能性があるので 一慨に小数点以下を丸める事もできません。 そういった事を考慮しますと、どういった処理が考えられるでしょうか? ご教授頂ければ幸いです。

  • integer型、long型、double型

    vb6.0についてお聞きいたします。 こちらの問題は、visual studio 2005のvbでは生じません。 windows xp上で動かしているのですが、どうやら 何もしていないあるパラメータに32000ぐらいの数字よりも大きな 数字をいれるとエラーになってしまいます。 それも、integer型、long型、double型のすべての型で生じます。 そういうものなのでしょうか? HPをいろいろ見ましても、long型で20億ぐらいは 表現できるように書いてあるのですが。

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

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

  • Double,Longをファイルに書き込み

    以下のように、Double,Longをファイルに書き込もうとした場合、どのようにキャストをすればよろしいのでしょうか? (String)でString型への変換や Integer.parseInt等を試したのですが、できませんでした。よろしくお願いします。 import java.io.*; class test { public static void main(String[] args) { double dNumber = 3.45; long lNumber = 12345; BufferedWriter bw = new BufferedWriter(new FileWriter("test.txt")); bw.write(dNumber); bw.write(lNumber); } //end main } //end class

    • ベストアンサー
    • Java
  • long double型の戻り値を持つ関数について

    文字列を浮動小数点に変換したいと思っています。 StrToFloat()を用いたのですが、有効数値がケタ落ちしてしまいました。 そこで、次のように関数を定義して実行したところ、やはり戻り値の値がケタ落ちしました。 long double StrToValue(AnsiString str) { ・・・・・ return value; } 具体的にはlong doubleの有効数値がdouble型の有効数値にまで落ちてしまっています。 次にポインタを使い、次のように変更したのですが、結果は同じでした。 void StrToValue(AnsiString str, long double *value) { ・・・・・ *value=・・・; ・・・・・ } どなたか、この解決方法と、できれば理由を教えてください。 なお使用した言語は、C++Builder 5 環境はWindows 98 です。