- PR -

POIについて

投稿者投稿内容
しの
会議室デビュー日: 2006/04/11
投稿数: 5
お住まい・勤務地: 愛知県
投稿日時: 2006-05-12 13:25
引用:

ヒロピンさんの書き込み (2006-05-11 17:28) より:
2進数で表すと以下のようになります。

【4.1】100.0001100110011001100110011001100110011001100110011
【4.2】100.00110011001100110011001100110011001100110011001101
【4.3】100.01001100110011001100110011001100110011001100110011
【4.4】100.0110011001100110011001100110011001100110011001101
【4.5】100.1
【4.6】100.1001100110011001100110011001100110011001100110011
【4.7】100.10110011001100110011001100110011001100110011001101
【4.8】100.11001100110011001100110011001100110011001100110011
【4.9】100.1110011001100110011001100110011001100110011001101
【5.0】101.0

どのように丸め処理がされているのでしょうか。
Javaのdouble型の誤差について詳しい説明が載っているサイトを
ご存知でしたら教えてください。
よろしくお願いします。



ここまでお分かりなのであれば、ご自分でgoogle等で検索されては如何でしょう?
それすら面倒であれば、java.math.BigDecimalを使ってください。
解決しますから。
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2006-05-12 16:37
_ asano (2006-05-05 05:53)

サンのサイトで原文と日本語訳を見つけました。再編集したとの注があるので、お手元のものとは内容が異なるかもしれません。

What Every Computer Scientist Should Know About Floating-Point Arithmetic
http://docs.sun.com/source/806-3568/ncg_goldberg.html

浮動小数点演算について
http://docs.sun.com/source/806-4847/ncg_goldberg.html

「以前は公開されてた」日本語訳というのは、こちらの TEX ファイルかも。
http://web.archive.org/web/20031225015958/http://urr3.cs.uec.ac.jp/ohkubo-k/papers/goldberg.tex
_ すずきひろのぶ (2006-05-05 11:14)

「計算では1.1 - 0.1 = 1.0が常に成り立つとは限らない」とか急に言われても何それ?だよね。
浮動小数点演算の解説は、ある意味、コンピュータの説明の中でも一番難しいものの1つだと思う。
暗黙のうちに「計算・実数・連続性」とずっと理解してきたところに、急にコンピュータで計算するときは「計算・算術的近似・非連続性」という理解に置き換えろといわれたら慌てるよ、やっぱり。言われないとわからないし、言われたところで急に変えろといわれても難しいよね。
----------
有限桁で計算すると、こうなります。
ハードの実装にもよりますし、
仮数の最下位桁の1ビットは交互に違うとか(Crayのベクトル計算機)の話や
最下位の厳密さはいろいろ
=========
I/Oでソフトの実装の精度も要確認とか、
strtod、strtol、strtoul 系関数 wcstod
http://www.rubyist.net/~matz/20060511.html#p02


[ メッセージ編集済み 編集者: MMX 編集日時 2006-05-16 10:53 ]
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2006-05-12 18:21
引用:

ヒロピンさんの書き込み (2006-05-11 17:28) より:
どのように丸め処理がされているのでしょうか。


double の演算方法については何十年も前からある IEEE754 で決まっているとおりのことをやっているだけでしょう。だから、問題は、Java の中で、どう2進数→10進数変換をしているか(打ち切りの仕方をどう決めているか)ということだけだと思います。
だから、4.1 等の2進数表記ではなく、4.1d * 100d 等の2進数表記がどうなっているかを気にされたほうが良いと思います。
この変換は、たしか java.lang.FloatingDecimal でやってたと思います。JDK にはソースコードも src.zip の中に標準で付属していますが、見る気もしません。

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}
ヒロピン
常連さん
会議室デビュー日: 2003/12/14
投稿数: 35
投稿日時: 2006-05-15 09:57
返事が遅くなってすみません。

しのさん、MMXさん、unibonさんありがとうございます。

>しのさん
double型をBigDecimalでコンストラクタすると
無限小数のまま表示されませんでしたっけ?
これから調べてみます。

>MMXさん
貴重な情報を親切に教えていただきありがとうございます。
参考にさせていただきます。

>unibonさん
IEEE754の記事はいくつか読んだのですがあまり・・・。
もう少し調査してみます。

スキルアップ/キャリアアップ(JOB@IT)