Google グループは Usenet の新規の投稿と購読のサポートを終了しました。過去のコンテンツは引き続き閲覧できます。
表示しない

double の比較

閲覧: 61 回
最初の未読メッセージにスキップ

Atsushi Hattori

未読、
2003/09/02 23:43:282003/09/02
To:
 服部と申します。

 doubleの数値を比較、というより、==の場合を考えたい
のですが、何かいい方法はありませんでしょうか。

 パソコンだと、プラスマイナス10^-14倍ぐらいで==と見る、
とかでしょうか。

 パソコンと大型計算機で仕様を変えなければならない
でしょうか。

 具体的には、「同じ座標ならば」という条件式を書きたい
のです。

Hideo Sir MaNMOS Morishita

未読、
2003/09/03 0:07:142003/09/03
To:

In article <bj3o18$ik7$1...@caraway.media.kyoto-u.ac.jp>,


範囲を絶対値にすると、小さい値が比較できませんね。

方法としては、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

ku...@gssm.otsuka.tsukuba.ac.jp

未読、
2003/09/03 0:28:182003/09/03
To:
久野です。

man...@stellar.co.jpさん:


> 方法としては、CPU(コンパイラ)の仕様で変更がある方法なので、賛否あると
> 思いますが、(指数は同一として)仮数のnビット(doubleの精度により決定)を
> 比較するというのはいかがでしょう。

値1 が 値2*(1+1E-14) と 値2*(1-1E+14) の間とか 久野

Fujii Hironori

未読、
2003/09/03 1:44:152003/09/03
To:
At Wed, 3 Sep 2003 12:43:28 +0900,
Atsushi Hattori wrote:

>  具体的には、「同じ座標ならば」という条件式を書きたいのです。

初歩的な質問なのかも知れませんが、「同じ座標」とはどういう意味ですか?

---
藤井宏憲

Fujii Hironori

未読、
2003/09/03 2:07:222003/09/03
To:
At Wed, 3 Sep 2003 12:43:28 +0900,
Atsushi Hattori wrote:
>  doubleの数値を比較、というより、==の場合を考えたい
> のですが、何かいい方法はありませんでしょうか。
>  パソコンだと、プラスマイナス10^-14倍ぐらいで==と見る、
> とかでしょうか。

さっき変な記事をポストしてしまったけど、ちゃんとキャンセルされていますように。

2つの浮動小数点の値が"十分近い"ことを判定するよい方法は。
http://www.catnet.ne.jp/kouno/c_faq/c14.html#5

fabs (a - b) の所を2次元なり3次元なりの2点間の距離にした方がいいのかもしない。
epsilon * a は fabs (epsilon * a) でないとまずい気もする。

---
藤井宏憲

Takao Ono

未読、
2003/09/03 4:21:292003/09/03
To:
小野@名古屋大学 です.

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 などの条件を追加することに
なるわけですが, もっとスマートな方法ってないものかなぁ.
--
名古屋大学大学院 情報科学研究科 計算機数理科学専攻
小野 孝男

TAKENAKA Kiyoshi

未読、
2003/09/03 5:30:012003/09/03
To:
竹中@狛江.電中研です。

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

Yasushi Shinjo

未読、
2003/09/03 10:04:012003/09/03
To:
新城@筑波大学情報です。こんにちは。
数値計算の話だと言語は関係ないんですが、

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言語の教
科書にはあんまり書いてない話かもしれません。

\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報       \\

IIJIMA Hiromitsu

未読、
2003/09/03 11:11:132003/09/03
To:
いいじまです。

> 数値計算の話だと言語は関係ないんですが、

御意。

> 一般的には、浮動小数点の場合は、== で比較してはいけません。
> その代わりに
> 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

R4000 2.2

未読、
2003/09/03 15:31:242003/09/03
To:
こんばんは、立花@鎌ヶ谷市です。

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 立花 晃@鎌ヶ谷市

Atsushi Hattori

未読、
2003/09/04 13:24:242003/09/04
To:
 服部と申します。

 1日出張っている間にたくさんのフォローをありがとう
ございます。

 叱られそうですが、どこかにひょっこり関数が落ちて
いたりするのかなぁ^^;、という、手抜き願望の質問でも
あったのですが、なかなかそうもいかないようですね。

 何とか手順を見直して、整数同士で比較できるような
形に持ち込んでみたいと思います。

----------------
 余談ですが、

http://hp.vector.co.jp/authors/VA000496/numcmp/help.htm

とか(拙作?)

----------------
 はたまた余談ですが、lang.cあたりでは、fj健在、の
印象あり。かなり懐かしい感じで、気持ちよく読ませて
いただけました。

Ishidan

未読、
2003/09/04 20:36:052003/09/04
To:

"Atsushi Hattori" <hat...@sme.kuciv.kyoto-u.ac.jp> wrote
in message news:bj7sgb$513$1...@caraway.media.kyoto-u.ac.jp...

>  何とか手順を見直して、整数同士で比較できるような
> 形に持ち込んでみたいと思います。

「座標系」の精度/分解能、比較したい精度などを考慮した
整数の座標系と本来の(実数の)座標系を相互に変換する関数
を作れば良い訳ですね。

座標系の精度と比較したい精度の兼ね合いは
if( ( nData1 xor nData2 ) < 4 )
みたいに調整するのはいかがでしょう。
# 0近辺はこれでいいのかな?

石段

ca...@kgc.co.jp

未読、
2003/09/08 0:39:472003/09/08
To:
y...@is.tsukuba.ac.jp (Yasushi Shinjo) writes:

> 一般的には、浮動小数点の場合は、== で比較してはいけません。

たしか Dijkstra が、
Algol68(?)の実装時に浮動小数点型の同値判定の基準をちょっと緩くして、
「最後のビットだけが違っていても同値」
とかしたそうで、いや~これが大失敗で(推移律が破れる)まいったよ……
てなことを書いてたと思いましたが

Structured programming
<URL:http://www.cs.utexas.edu/users/EWD/transcriptions/EWD02xx/EWD268.html>
かと思いきや、それらしい部分がないですね??
何の本だったかしら???

神田敏広 <ca...@kgc.co.jp>

Shinji KONO

未読、
2003/09/08 3:23:342003/09/08
To:
河野真治 @ 琉球大学情報工学です。

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(機能と構成)

ca...@kgc.co.jp

未読、
2003/09/10 8:50:402003/09/10
To:
ko...@ie.u-ryukyu.ac.jp (Shinji KONO) writes:

> > 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>

新着メール 0 件