doubleの数値を比較、というより、==の場合を考えたい
のですが、何かいい方法はありませんでしょうか。
パソコンだと、プラスマイナス10^-14倍ぐらいで==と見る、
とかでしょうか。
パソコンと大型計算機で仕様を変えなければならない
でしょうか。
具体的には、「同じ座標ならば」という条件式を書きたい
のです。
範囲を絶対値にすると、小さい値が比較できませんね。
方法としては、CPU(コンパイラ)の仕様で変更がある方法なので、賛否あると
思いますが、(指数は同一として)仮数のnビット(doubleの精度により決定)を
比較するというのはいかがでしょう。
--
___ わしは、山吹色のかすてーらが大好きでのぅ
[[o o]] ふぉっふぉっふぉ
'J' 森下 お代官様 MaNMOS 英夫@ステラクラフト
PGP Finger = CD EA D5 A8 AD B2 FE 7D 02 74 87 52 7C B7 39 37
> 方法としては、CPU(コンパイラ)の仕様で変更がある方法なので、賛否あると
> 思いますが、(指数は同一として)仮数のnビット(doubleの精度により決定)を
> 比較するというのはいかがでしょう。
値1 が 値2*(1+1E-14) と 値2*(1-1E+14) の間とか 久野
> 具体的には、「同じ座標ならば」という条件式を書きたいのです。
初歩的な質問なのかも知れませんが、「同じ座標」とはどういう意味ですか?
---
藤井宏憲
さっき変な記事をポストしてしまったけど、ちゃんとキャンセルされていますように。
2つの浮動小数点の値が"十分近い"ことを判定するよい方法は。
http://www.catnet.ne.jp/kouno/c_faq/c14.html#5
fabs (a - b) の所を2次元なり3次元なりの2点間の距離にした方がいいのかもしない。
epsilon * a は fabs (epsilon * a) でないとまずい気もする。
---
藤井宏憲
double の同値判定って, 難しいですよね.
<87bru2s8v9.wl%fu...@chi.its.hiroshima-cu.ac.jp>の記事において
fu...@chi.its.hiroshima-cu.ac.jpさんは書きました。
fujii> 2つの浮動小数点の値が"十分近い"ことを判定するよい方法は。
fujii> http://www.catnet.ne.jp/kouno/c_faq/c14.html#5
fujii>
fujii> fabs (a - b) の所を2次元なり3次元なりの2点間の距離にした方がいいのかもしない。
fujii> epsilon * a は fabs (epsilon * a) でないとまずい気もする。
もちろん fabs は必要ですが, a と b が対称でないのもちょっと気にな
ります.
で, たとえば fabs(a - b) <= epsilon * max(fabs(a), fabs(b)) とかやっ
たりするんでしょうけど, さらに「この条件では 0 と DBL_MIN は『十
分近い』と判定されないが, それでいいのだろうか」という問題が発生
して困っています.
そこまで考えると fabs(a - b) <= delta などの条件を追加することに
なるわけですが, もっとスマートな方法ってないものかなぁ.
--
名古屋大学大学院 情報科学研究科 計算機数理科学専攻
小野 孝男
In article <0309031721...@flame.hirata.nuee.nagoya-u.ac.jp> ta...@hirata.nuee.nagoya-u.ac.jp wrote on Wed, 3 Sep 2003 08:21:29 GMT:
> さらに「この条件では 0 と DBL_MIN は『十
>分近い』と判定されないが, それでいいのだろうか」という問題が発生
>して困っています.
計算途中の桁落ち等で0になるのは、どの程度かで決まるので、
計算機には分らないでしょう。人間が決めるしかない?
>そこまで考えると fabs(a - b) <= delta などの条件を追加することに
>なるわけですが, もっとスマートな方法ってないものかなぁ.
こうなるんでしょうけど、仕方ないのでは。
一番いい方法は、基準値が1.0のものをaとかbに選ぶ。
-----------------------------------------------------------------
電力中央研究所 電力システム部 竹中 清
- kiyos - kiyos - kiyos - kiyos - kiyos - kiyos - kiyos - kiyos -
take...@criepi.denken.or.jp
In article <bj3o18$ik7$1...@caraway.media.kyoto-u.ac.jp>
"Atsushi Hattori" <hat...@sme.kuciv.kyoto-u.ac.jp> writes:
> doubleの数値を比較、というより、==の場合を考えたい
> のですが、何かいい方法はありませんでしょうか。
> パソコンだと、プラスマイナス10^-14倍ぐらいで==と見る、
> とかでしょうか。
一般的には、浮動小数点の場合は、== で比較してはいけません。
その代わりに
fabs((a-b)/a) <= epsilon
とやるのが、一般的です。EPSILON が 0.01 なら、1% の精度で同
じという意味です。== で比較すると、繰り返して精度をあげてい
くようなアルゴリズムでは、最後は行ったり来たりで振動して無限
ループになったりします。
double だと、48 ビットの精度があるのですが、それだけ
0.000...1 とやってもいいかというと、そうもいかないでしょう。
ギリギリだと、== と同じく振動して止まらないこともあるし。自
分が欲しい精度で止めるのでしょう。
Fortran の教科書には、書いてあるんでしょうけれど、C言語の教
科書にはあんまり書いてない話かもしれません。
\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報 \\
> 数値計算の話だと言語は関係ないんですが、
御意。
> 一般的には、浮動小数点の場合は、== で比較してはいけません。
> その代わりに
> fabs((a-b)/a) <= epsilon
> とやるのが、一般的です。EPSILON が 0.01 なら、1% の精度で同
> じという意味です。
御意。
ただ、a がちょうどゼロになってしまったらプロセッサと OS の設定によっては
ゼロ除算例外で落ちるだろ…と考えると、a や b がどういう挙動をする変数な
のか、とか、もう少しだけ手の込んだコードが必要になりますけどね。
> double だと、48 ビットの精度があるのですが、それだけ
> 0.000...1 とやってもいいかというと、そうもいかないでしょう。
標準的な 64 ビットの double 型だと仮数部は 54 ビット(仮数部の「1.」の後
に 53 ビット)ですね。x86 の long double は仮数部 64 ビット、指数部と符
号とで 16ビット、合計 80 ビットです。
> Fortran の教科書には、書いてあるんでしょうけれど、C言語の教
> 科書にはあんまり書いてない話かもしれません。
ですね。
FORTRAN77 全盛の時代は「数値計算=FORTRAN を使うこと」だったので FORTRAN
の教科書が扱っていたけど、C が実用的に数値計算に使われる時代になると多様
な言語(場合によっては効率の悪い言語も)が利用されるようになったので、誤
差の取り扱いのような話題は数値計算一般論の教科書に譲った、というべきでし
ょうね。
========================================================================
飯嶋 浩光 / でるもんた・いいじま http://www.ht.sakura.ne.jp/~delmonta/
IIJIMA Hiromitsu, aka Delmonta mailto:delm...@ht.sakura.ne.jp
TAKENAKA Kiyoshi <take...@criepi.denken.or.jp> writes:
> In article <0309031721...@flame.hirata.nuee.nagoya-u.ac.jp> ta...@hirata.nuee.nagoya-u.ac.jp wrote on Wed, 3 Sep 2003 08:21:29 GMT:
> > さらに「この条件では 0 と DBL_MIN は『十
> >分近い』と判定されないが, それでいいのだろうか」という問題が発生
> >して困っています.
>
> 計算途中の桁落ち等で0になるのは、どの程度かで決まるので、
> 計算機には分らないでしょう。人間が決めるしかない?
掛算して、合うものも合わなくなっちゃうこともあるので、
結局人間が決める(どうやって同一と見倣すかも含めて)しか
ない気がします。
#少し前にそれでハマったので
--
ta...@kc5.so-net.ne.jp 立花 晃@鎌ヶ谷市
1日出張っている間にたくさんのフォローをありがとう
ございます。
叱られそうですが、どこかにひょっこり関数が落ちて
いたりするのかなぁ^^;、という、手抜き願望の質問でも
あったのですが、なかなかそうもいかないようですね。
何とか手順を見直して、整数同士で比較できるような
形に持ち込んでみたいと思います。
----------------
余談ですが、
http://hp.vector.co.jp/authors/VA000496/numcmp/help.htm
とか(拙作?)
----------------
はたまた余談ですが、lang.cあたりでは、fj健在、の
印象あり。かなり懐かしい感じで、気持ちよく読ませて
いただけました。
> 何とか手順を見直して、整数同士で比較できるような
> 形に持ち込んでみたいと思います。
「座標系」の精度/分解能、比較したい精度などを考慮した
整数の座標系と本来の(実数の)座標系を相互に変換する関数
を作れば良い訳ですね。
座標系の精度と比較したい精度の兼ね合いは
if( ( nData1 xor nData2 ) < 4 )
みたいに調整するのはいかがでしょう。
# 0近辺はこれでいいのかな?
石段
> 一般的には、浮動小数点の場合は、== で比較してはいけません。
たしか Dijkstra が、
Algol68(?)の実装時に浮動小数点型の同値判定の基準をちょっと緩くして、
「最後のビットだけが違っていても同値」
とかしたそうで、いや~これが大失敗で(推移律が破れる)まいったよ……
てなことを書いてたと思いましたが
Structured programming
<URL:http://www.cs.utexas.edu/users/EWD/transcriptions/EWD02xx/EWD268.html>
かと思いきや、それらしい部分がないですね??
何の本だったかしら???
神田敏広 <ca...@kgc.co.jp>
In article <s7fad9f...@xxx.kgc.co.jp>, ca...@kgc.co.jp writes
> Algol68(?)の実装時に浮動小数点型の同値判定の基準をちょっと緩くして、
> 「最後のビットだけが違っていても同値」
> とかしたそうで、いや~これが大失敗で(推移律が破れる)まいったよ……
> てなことを書いてたと思いましたが
プログラム作法だったような..
> Structured programming
> <URL:http://www.cs.utexas.edu/users/EWD/transcriptions/EWD02xx/EWD268.html>
> かと思いきや、それらしい部分がないですね??
こっちはないですね。最近はWWWで読めるのか。
Structured Programming は、プログラムを始めたばっかりの頃(大
学22年生)に、渡されて読んだな。で、フォートランのカードをイ
ンデントしながらwhile とかのコメントを入れるってのをやって、
採点する人にあきれられたことがあります。
でも、structured programming は、while program の理論とかと
一緒にやるから意味があるはずなので、あまりピンとこなかったの
も仕方ないか。record とかも良くわからなかったし。とはいえ、
C の構造体を見たときに一発で理解したのは、Pascal 勉強してた
からなんだろうな。
---
Shinji KONO @ Information Engineering, University of the Ryukyus,
PRESTO, Japan Science and Technology Corporation
河野真治 @ 琉球大学工学部情報工学科,
科学技術振興事業団さきがけ研究21(機能と構成)
> > Algol68(?)の実装時に浮動小数点型の同値判定の基準をちょっと緩くして、
> > 「最後のビットだけが違っていても同値」
> > とかしたそうで、いや~これが大失敗で(推移律が破れる)まいったよ……
> > てなことを書いてたと思いましたが
>
> プログラム作法だったような..
発見しました。
サイエンス社の「構造化プログラミング」6 節
----8<----
ここで私の大失敗の 1 つを告白しましょう。
私達が ALGOL 60 の処理系を作るときに、
"x=y" が、ちょうど等しい場合のみならず、
最下位の桁だけ異なっている場合にも、
真(true)の値を返すように決定したのです。
というのは、もしそうでなければ、true の値をとることは、
とても起こりそうにないことでしょう。
私達は、丸めの誤差の範囲内で振動して収束する反復計算を
考えていたのです。
私達は、実数が等しいという点に、(きわめて好意的に)寛容であったのですが、
この演算は、弱すぎて使いものにならないことがすぐにわかりました。
何がだめかというと、これでは a=b かつ b=c が成り立っていても、
a=c が成り立つとの結論を出せないのです。
そして上記の決定は、ただちに変更しました。
----8<----
だそうで。
なぜ「すぐわかった」のかも書いて欲しかった。
# じいさんたちの失敗談はおもしろいなあ
# dmr の cd とか Knuth のスーパー乱数生成とか…
この本まだ売ってるんだ!!
<URL:http://www.amazon.co.jp/exec/obidos/ASIN/4781902766/250-3295821-9161026>
これは目次が書いてないけど、内容は三部構成で、
1 構造化プログラミング論
2 データ構造化序論
3 階層的プログラム構造
となっております。
3 はオブジェクト指向の元祖 SIMULA 67 のペーパー。
神田敏広 <ca...@kgc.co.jp>