Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

double の比較

74 views
Skip to first unread message

Atsushi Hattori

unread,
Sep 2, 2003, 11:43:28 PM9/2/03
to
 服部と申します。

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

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

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

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

Hideo Sir MaNMOS Morishita

unread,
Sep 3, 2003, 12:07:14 AM9/3/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

unread,
Sep 3, 2003, 12:28:18 AM9/3/03
to
久野です。

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


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

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

Fujii Hironori

unread,
Sep 3, 2003, 1:44:15 AM9/3/03
to
At Wed, 3 Sep 2003 12:43:28 +0900,
Atsushi Hattori wrote:

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

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

---
藤井宏憲

Fujii Hironori

unread,
Sep 3, 2003, 2:07:22 AM9/3/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

unread,
Sep 3, 2003, 4:21:29 AM9/3/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

unread,
Sep 3, 2003, 5:30:01 AM9/3/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

unread,
Sep 3, 2003, 10:04:01 AM9/3/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

unread,
Sep 3, 2003, 11:11:13 AM9/3/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

unread,
Sep 3, 2003, 3:31:24 PM9/3/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

unread,
Sep 4, 2003, 1:24:24 PM9/4/03
to
 服部と申します。

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

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

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

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

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

とか(拙作?)

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

Ishidan

unread,
Sep 4, 2003, 8:36:05 PM9/4/03
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

unread,
Sep 8, 2003, 12:39:47 AM9/8/03
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

unread,
Sep 8, 2003, 3:23:34 AM9/8/03
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

unread,
Sep 10, 2003, 8:50:40 AM9/10/03
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 new messages