doubleの誤差

[戻る]
ちゃっぴ 2008/02/18(月) 14:50:02
お恥ずかしい話なのですが、doubleの誤差について質問があります。

浮動小数点の丸め誤差は、2進数で表せない小数値の場合発生すると認識していたのですが、
整数が入っているdoubleどうしの演算(+,-,/,*)を行い、答えも整数の場合、
誤差が発生する可能性はありますか?

仲澤@失業者 2008/02/18(月) 15:25:18
私もこんな回答でお恥ずかしいのですが

double tri = ( double)1/3;

って、1/3の数学的理論値とtriの間に誤差が無いと思っていましたか(質問)。

仲澤@失業者 2008/02/18(月) 15:34:01
ごめん間違った
double tri  = ( double)1/3;
    tri *= ( double)3;  
ですね、結果が整数のみの場合だし。

中間の演算結果も全て整数になることが保障されている場合でも、
指数付きになっちゃえば有効桁外は誤差になりますね。

ちゃっぴ 2008/02/18(月) 16:27:05
仲澤@失業者さん、ご回答ありがとうございます。

>中間の演算結果も全て整数になることが保障されている場合でも、
>指数付きになっちゃえば有効桁外は誤差になりますね。

これは、15桁より大きな値になった場合ということでよね?
ということは、計算に使用する値、結果とも15桁以下の整数の場合は
誤差は発生しないと考えてもOKですか?

・・・整数値であっても、doubleに入れてしまえば仮数は小数点ありの数値になる
=誤差が生じる?のかと気になっていました。

たいちう 2008/02/18(月) 17:28:16
> これは、15桁より大きな値になった場合ということでよね?
> ということは、計算に使用する値、結果とも15桁以下の整数の場合は
> 誤差は発生しないと考えてもOKですか?

途中経過も含めて15桁以下の整数なら多分OK。

> ・・・整数値であっても、doubleに入れてしまえば仮数は小数点ありの数値になる
> =誤差が生じる?のかと気になっていました。

10進数で例えると、整数1234を浮動小数点で表す場合、
1.234×10^3になります。仮数部が十分な桁を持っているならば、
整数1234を誤差なく表現できます。

基本的には2進数の場合も同じことをしているので、
仮数部が小数点ありになっても誤差はありません。


# 浮動小数型で小数の誤差がよく問題になるのは、
# 小数値1.234(10進数)を表すような場合。
# 10進数で表すと小数点以下3桁ぴったりですが、2進数で
# 表すと循環小数になり、仮数部の桁が足りなくなり、
# 誤差が生じます。


上に多分と書いてますが、計算に許される誤差についての規格を
見つけられなかったからです。
まあ、誤差を気にするならば、double型を使わないことをお勧めします。
__int64とか多倍長とかを使いましょう。

仲澤@失業者 2008/02/18(月) 19:03:16
> __int64とか多倍長とかを使いましょう。

賛成。

又は、BCD演算ライブラリ、10進演算ライブラリなど、
基本的に桁数制限の無い(ゆるい)数値演算処理系を
使うべきかもしれません。

ちゃっぴ 2008/02/18(月) 19:17:47
[[解決]]
たいちうさん、仲澤@失業者さん、ご回答ありがとうございました。

多分誤差が出ないとの回答、納得しました。

また、「__int64」や「BCD演算ライブラリ、10進演算ライブラリ」は
全然知りませんでしたので、調べてみます。

問題のdoubleを使用している箇所は、小数点を扱うからではなく、
単にデカイ数字を扱いたかったためなので、
今ちらりと調べた「__int64」が適しているような感じがしました。

大変助かりました。ありがとうございます。

古いスレッドには追加発言できません。