解決済みの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型にする必要があります。
-
- 質問日時:
- 2007/5/16 15:48:08
-
- 解決日時:
- 2007/5/17 09:43:45
-
- 回答数:
- 5
-
- お礼:
- 知恵コイン
- 25枚
-
- 閲覧数:
- 19,824
-
- ソーシャルブックマークへ投稿:
- Yahoo!ブックマークへ投稿
- はてなブックマークへ投稿
- (ソーシャルブックマークとは)
ベストアンサーに選ばれた回答
原因は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
このQ&Aは3ナイス!されています!
役に立ったと思った回答に、ナイス!してみよう!
ベストアンサー以外の回答
(4件中1〜4件)
- 並べ替え:回答日時の
- 新しい順
- |
- 古い順
浮動小数点の演算誤差が有るのは皆さんが答えている通りです。
そして、それの回避方法も皆さんが答えてくれていますが、少々補足します。
今時の言語処理系では大抵の場合、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
C言語でなくJavaだったのですが同じ現象が起こりました。
そのとき調べた結果ではdouble型の計算は 2進数で行うことから少数などの計算をすると
ある程度の誤差が発生すると言うサイトを見た記憶があります。
だからそれと同じ原因だと思われます。
Javaの場合はBigDecimal と言うものを使えば回避できましたがC言語ではわかりません。
回答がないようならGoogle等で調べてはどうでしょうか?
- 回答日時:2007/5/16 16:27:18
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の補数」の引き算を、きっちり理解する!
質問した人からのコメント