doubleの誤差 – プログラミング – Home

通知
すべてクリア

[解決済] doubleの誤差


ちゃっぴ
 ちゃっぴ
(@ちゃっぴ)
ゲスト
結合: 17年前
投稿: 17
Topic starter  

お恥ずかしい話なのですが、doubleの誤差について質問があります。

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


引用未解決
トピックタグ
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

私もこんな回答でお恥ずかしいのですが

double tri = ( double)1/3;

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


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

ごめん間違った
double tri = ( double)1/3;
    tri *= ( double)3;  
ですね、結果が整数のみの場合だし。

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


返信引用
ちゃっぴ
 ちゃっぴ
(@ちゃっぴ)
ゲスト
結合: 17年前
投稿: 17
Topic starter  

仲澤@失業者さん、ご回答ありがとうございます。

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

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

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


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

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

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

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

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

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

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

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


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

> __int64とか多倍長とかを使いましょう。

賛成。

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


返信引用
ちゃっぴ
 ちゃっぴ
(@ちゃっぴ)
ゲスト
結合: 17年前
投稿: 17
Topic starter  

たいちうさん、仲澤@失業者さん、ご回答ありがとうございました。

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

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

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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