VC++6.0 SP5
WinXP SP2
doubleの計算にはまっております
doubleで比較ができないことくらいは知っていたのですが・・・
double d = 50.0 * 2.55 + 0.5;
と計算させると、dには128.000000000と格納されます
このときdをint型の変数に格納してint型の変数の値が128であることを期待したのですが
double d = 50.0 * 2.55 + 0.5;
int i = (int)d;
と、するとiは127になります
やりたいことは、
doubleの変数から少数を以下を切り捨ててint型の変数に格納したいのですが、何かいい
方法はないでしょうか?
一旦、文字列にしてからってのもいまいちで・・・
また、このような振る舞いから、doubleというものについて再度正しい知識を得たいので
すが、詳しく解説しているサイトをご存じないでしょうか?
> doubleの変数から少数を以下を切り捨てて
floor?
> double d = 50.0 * 2.55 + 0.5;
本当に 128 になりますか?
(デバッガで追うと、127.99999999999999。2.55で誤差が出ているっぽ)
つ[floor]
「なぜ」doubleの比較がダメなのかが解れば,今回の問題は同根であることがわかるはず
ですが……。
printf(%.15f, d);
とやってみれば,dが128より少し小さい値になっていることがわかると思います。
小数部を切り捨てれば,当然127になるわけです。
VC++で浮動小数点数を正確に扱いたい場合は,2の整数乗の和で表現できる値を選ばない
と,計算誤差が常に発生しますよ。
# 今回は2.55。
アドバイスありがとうございます
VC++のデバッグウインドのウォッチを使うと、128.00000と表示されるので誤解していました
double d = 50.0 * 255 / 100 + 0.5;
とすればいいんですね
> double d = 50.0 * 255 / 100 + 0.5;
いや,そういうつもりで書いたわけではなかったのですが……。
# 確かに,私の表現ではそうなってしまう。
途中の計算結果,最終的な計算結果,全てが2の整数乗の和で表現できないと,常に丸め
誤差が出ます。