ここから本文です

解決済みのQ&A

C言語でdouble型の小数点の引き算をしたら1.15-1.1の結果が0.05のはずが0.04999・...

issaon55さん

C言語でdouble型の小数点の引き算をしたら1.15-1.1の結果が0.05のはずが0.04999・・822になります。0.05で使用したいのですがどうにかならないでしょうか。

int a;
double d;
d = 1.15 - 1.1;
a = (int)(d * 20);

この結果でaの値に1が欲しいのですが。0.9999になって結果が0になってしまいます。

補足
最後の結果ですが、どうしてもint型にする必要があります。

違反報告

ベストアンサーに選ばれた回答

zas_legrusさん

原因は2進数処理の誤差によるものなのでC言語に限らず必ずそうなります。
シチュエーションが不明なので一般論として、
1)同程度の数の引き算はしない様に式を変換する。
--同程度の数の引き算は「桁落ち」を起こして無意味な計算結果を出す素です。
2)固定小数点の技法を使う。
--小数点以下2,3桁の数値だけを扱う場合は、100倍、1000倍して、整数で計算を行うと誤差が出ません。
3)適当な桁で丸める。
--整数へのキャストが「切捨て」であるため、「四捨五入」するようにする。
--簡易的にはキャストする前に0.000000005を足すとか。

人間は1.1といえば、それ以下0が無限に続くと勝手に認識しますが、(1.10000・・・・)実際の計算機上ではありえませんので。1.15とか1.1とかの数値や結果にどれだけの精度を期待するのか(有効数字)を把握することが大事です。

  • 回答日時:2007/5/16 17:12:42

質問した人からのコメント

  • 3)の丸めを使用することにします。
  • コメント日時:2007/5/17 09:43:45

グレード

このQ&Aは3ナイス!されています!
役に立ったと思った回答に、ナイス!してみよう!

ベストアンサー以外の回答

(4件中1〜4件)

並べ替え:回答日時の
新しい順
古い順

 

planets_toshiさん

浮動小数点の演算誤差が有るのは皆さんが答えている通りです。
そして、それの回避方法も皆さんが答えてくれていますが、少々補足します。
今時の言語処理系では大抵の場合、IEEE 754準拠の浮動少数演算を行っていると思います。
検索エンジンで IEEE 754を調べて見ると詳細が分かります。(但し殆どの説明が英語からの直訳ベースなので、書いてある事を理解するのが面倒なのがたまにきずですが)
また、処理系によっては演算精度や有効桁数を指定できたりもするので、それで回避する事が出来る場合も有ります。
が、精度を求める演算では(可能ならば)浮動小数点演算を用いないのが一番賢明です。

  • 回答日時:2007/5/17 05:24:53

beforosさん

2進数で0.1が無限小数になるための誤差です。
四捨五入をするようにしましょう。そうしないと切り捨てられて質問のようになります。
方法はint型にするとき、その直前で0.5を加えます。
このコーディングでは、最後の行で
a=(int)(d*20+0.5)
で良いと思います。

  • 回答日時:2007/5/16 23:43:09

initiationloadさん

C言語でなくJavaだったのですが同じ現象が起こりました。
そのとき調べた結果ではdouble型の計算は 2進数で行うことから少数などの計算をすると
ある程度の誤差が発生すると言うサイトを見た記憶があります。
だからそれと同じ原因だと思われます。
Javaの場合はBigDecimal と言うものを使えば回避できましたがC言語ではわかりません。
回答がないようならGoogle等で調べてはどうでしょうか?

  • 回答日時:2007/5/16 16:27:18

la_fisher2さん

double a;
double d;

d = 1.15 - 1.1;
a = d * 20;

これで、良いと思いますけど。

  • 回答日時:2007/5/16 16:25:49

この質問に付けられたタグ

タグとは

あなたにおすすめの解決済みの質問

c言語のメモリの開放に付いて2次元配列を使ったのでメモリの開放をしようとしたらどうしてもアボートし...
c言語について学校の課題で、newton-raphson法でf(x)=e^x-3x=0の解を求めようの課題が出て、とりあえず...
c言語プログラムでメモリの確保の仕方に関しての質問です。通常で動かそうとすると動作が停止しましたと...

あなたにおすすめの知恵ノート

「2の補数」の引き算を、きっちり理解する!

PR

PR
Yahoo!知恵袋のQ&Aアプリが登場! さくさく検索、かんたんに質問や回答ができる! Yahoo!知恵袋アプリ

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。

お客様自身の責任と判断で、ご利用ください。


お得情報

太陽のマテ茶プレゼント中
香ばしく、スッキリした後味
すき焼き食べたらマテ!

その他のキャンペーン

知恵コレに追加する

閉じる

知恵コレクションをするID/ニックネームを選択し、「追加する」ボタンを押してください。
※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。

ほかのID/ニックネームで利用登録する