お恥ずかしい話なのですが、doubleの誤差について質問があります。
浮動小数点の丸め誤差は、2進数で表せない小数値の場合発生すると認識していたのですが、
整数が入っているdoubleどうしの演算(+,-,/,*)を行い、答えも整数の場合、
誤差が発生する可能性はありますか?
私もこんな回答でお恥ずかしいのですが
double tri = ( double)1/3;
って、1/3の数学的理論値とtriの間に誤差が無いと思っていましたか(質問)。
ごめん間違った
double tri = ( double)1/3;
tri *= ( double)3;
ですね、結果が整数のみの場合だし。
中間の演算結果も全て整数になることが保障されている場合でも、
指数付きになっちゃえば有効桁外は誤差になりますね。
仲澤@失業者さん、ご回答ありがとうございます。
>中間の演算結果も全て整数になることが保障されている場合でも、
>指数付きになっちゃえば有効桁外は誤差になりますね。
これは、15桁より大きな値になった場合ということでよね?
ということは、計算に使用する値、結果とも15桁以下の整数の場合は
誤差は発生しないと考えてもOKですか?
・・・整数値であっても、doubleに入れてしまえば仮数は小数点ありの数値になる
=誤差が生じる?のかと気になっていました。
> これは、15桁より大きな値になった場合ということでよね?
> ということは、計算に使用する値、結果とも15桁以下の整数の場合は
> 誤差は発生しないと考えてもOKですか?
途中経過も含めて15桁以下の整数なら多分OK。
> ・・・整数値であっても、doubleに入れてしまえば仮数は小数点ありの数値になる
> =誤差が生じる?のかと気になっていました。
10進数で例えると、整数1234を浮動小数点で表す場合、
1.234×10^3になります。仮数部が十分な桁を持っているならば、
整数1234を誤差なく表現できます。
基本的には2進数の場合も同じことをしているので、
仮数部が小数点ありになっても誤差はありません。
# 浮動小数型で小数の誤差がよく問題になるのは、
# 小数値1.234(10進数)を表すような場合。
# 10進数で表すと小数点以下3桁ぴったりですが、2進数で
# 表すと循環小数になり、仮数部の桁が足りなくなり、
# 誤差が生じます。
上に多分と書いてますが、計算に許される誤差についての規格を
見つけられなかったからです。
まあ、誤差を気にするならば、double型を使わないことをお勧めします。
__int64とか多倍長とかを使いましょう。
> __int64とか多倍長とかを使いましょう。
賛成。
又は、BCD演算ライブラリ、10進演算ライブラリなど、
基本的に桁数制限の無い(ゆるい)数値演算処理系を
使うべきかもしれません。
たいちうさん、仲澤@失業者さん、ご回答ありがとうございました。
多分誤差が出ないとの回答、納得しました。
また、「__int64」や「BCD演算ライブラリ、10進演算ライブラリ」は
全然知りませんでしたので、調べてみます。
問題のdoubleを使用している箇所は、小数点を扱うからではなく、
単にデカイ数字を扱いたかったためなので、
今ちらりと調べた「__int64」が適しているような感じがしました。
大変助かりました。ありがとうございます。