doubleをintにキャストする – プログラミング – Home

doubleをintにキャストする
 
通知
すべてクリア

[解決済] doubleをintにキャストする


え~いち
 え~いち
(@え~いち)
ゲスト
結合: 19年前
投稿: 78
Topic starter  

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というものについて再度正しい知識を得たいので
すが、詳しく解説しているサイトをご存じないでしょうか?


引用未解決
トピックタグ
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

> doubleの変数から少数を以下を切り捨てて
floor?

> double d = 50.0 * 2.55 + 0.5;
本当に 128 になりますか?
(デバッガで追うと、127.99999999999999。2.55で誤差が出ているっぽ)


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

つ[floor]


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 22年前
投稿: 320
 

「なぜ」doubleの比較がダメなのかが解れば,今回の問題は同根であることがわかるはず
ですが……。

printf(%.15f, d);
とやってみれば,dが128より少し小さい値になっていることがわかると思います。
小数部を切り捨てれば,当然127になるわけです。

VC++で浮動小数点数を正確に扱いたい場合は,2の整数乗の和で表現できる値を選ばない
と,計算誤差が常に発生しますよ。
# 今回は2.55。


返信引用
え~いち
 え~いち
(@え~いち)
ゲスト
結合: 19年前
投稿: 78
Topic starter  

アドバイスありがとうございます
VC++のデバッグウインドのウォッチを使うと、128.00000と表示されるので誤解していました

double d = 50.0 * 255 / 100 + 0.5;

とすればいいんですね


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 22年前
投稿: 320
 

> double d = 50.0 * 255 / 100 + 0.5;

いや,そういうつもりで書いたわけではなかったのですが……。
# 確かに,私の表現ではそうなってしまう。

途中の計算結果,最終的な計算結果,全てが2の整数乗の和で表現できないと,常に丸め
誤差が出ます。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました