- 1 名前:デフォルトの名無しさん [2008/01/04(金) 14:25:44 ]
- 主にx86系で浮動小数点を扱う話題
- 4 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 00:34:25 ]
- このスレは最初まったく伸びないが、突然ザクザクと1人の書き込みで急に伸びだし、
しかし200レスあたりでネタがつきて、その後はパッタリと伸びなくなる。
- 5 名前:デフォルトの名無しさん [2008/01/05(土) 05:23:34 ]
- >>2
デフォの誤差じゃなくて、CPUごとの誤差だよ。 同じ計算してもCPUが違うと結果が異なるって話。 CPU自体の違いだから、ソフトじゃどうにもならないって話
- 6 名前:デフォルトの名無しさん [2008/01/05(土) 05:24:01 ]
- >>5
まちがえた。3へのレス
- 7 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/01/05(土) 05:30:13 ]
- IEEE754準拠モード使う限り誤差も規格どおりになるって言ってるだろ。文盲か?
- 8 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 05:37:08 ]
- CPUごとの誤差ってのは非IEEE754準拠モードでの話か?
- 9 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/01/05(土) 05:53:23 ]
- 非準拠モードは実装依存の誤差が許容できる用途でだけ使うこと。
それこそCPUごとの差を知る必要がない用途でだけね。 イミネェ
- 10 名前:デフォルトの名無しさん [2008/01/05(土) 07:14:38 ]
- 普通にx87の浮動小数点コプロセッサを使うようにして、C++コンパイラで、
float a,b,c; b=10/3; c=20/3; a=b/c; とかってやると、Duronと、Athlon64では、aの結果が異なる。 という一例があるとして、 じゃあ、DuronとAthlon64の浮動小数点コプロ間は、どのぐらい誤差を生じるものなのだろうか。 っていう疑問なんだけど
- 11 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/01/05(土) 07:31:10 ]
- >という一例があるとして、
はい、ソースの提示を求めます
- 12 名前:デフォルトの名無しさん [2008/01/05(土) 07:37:26 ]
- >>11
だから、どうゆう状況でCPU間の誤差が出るか分かってば質問なんかしないって。 どうゆう状況かわからないけど、誤差が出るときがあるんだって。 企業とかでネトゲ造ったことある奴なら知ってることだろ。 だからネトゲは、キー入力ではなく、座標を直接送信するか、 サーバとかの1台のPCで座標を計算する
- 13 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/01/05(土) 07:41:47 ]
- 状況もわからないのにCPUごとに違うなんて信じてるんですか?
- 14 名前:デフォルトの名無しさん [2008/01/05(土) 08:09:35 ]
- >>13
今、再現してるからちょっとまってろ
- 15 名前:デフォルトの名無しさん [2008/01/05(土) 08:16:41 ]
- >>14
まだかよ
- 16 名前:デフォルトの名無しさん [2008/01/05(土) 09:46:36 ]
- あと反日はかかりそう
- 17 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 10:03:15 ]
- 韓国か
- 18 名前:デフォルトの名無しさん [2008/01/05(土) 10:07:53 ]
- 北朝鮮じゃね?
- 19 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 10:20:19 ]
- うちにあるPentium搭載のマシンならすばらしい結果を出してくれるかも
5年くらい起動していないから動くかどうか怪しいが
- 20 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 10:23:36 ]
- このスレの真実は>>4
- 21 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/01/05(土) 10:26:14 ]
- >>19
wwwwwwwwwwww アレのせいで誤解されてるんじゃないのかね でも問題の初期の奴って回収されたんじゃなかったっけ
- 22 名前:デフォルトの名無しさん [2008/01/05(土) 10:53:41 ]
- ついに異なる個所を特定したぞ!
昼にはうぷできるかも
- 23 名前:デフォルトの名無しさん [2008/01/05(土) 10:55:47 ]
- 切り出してやったら同じだったw。
てことは、その前の浮動小数点演算で、例外が発生してるのかも
- 24 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 10:59:23 ]
- x86に限定しないほうがスレ伸びそう
- 25 名前:デフォルトの名無しさん [2008/01/05(土) 12:07:53 ]
- 他にやることができたので、検証は今晩か明日に
- 26 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 14:00:58 ]
- x87命令とSSEとで誤差があるとかいうたわけた話ではなかろうな。
- 27 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 15:46:53 ]
- >>14
わっふるわっふる
- 28 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 15:49:38 ]
- >>14
わっふるわっふる
- 29 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 17:35:37 ]
- >>14
わっふるわっふる
- 30 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 17:46:20 ]
- CPU の系統が同じなら、同じバイナリを使って検証せんとあかんぜよ。
系統が違うなら、C とか使わずアセンブリ言語使って同等のコードを作らんとあかんぜよ。
- 31 名前:デフォルトの名無しさん [2008/01/06(日) 06:04:39 ]
- よく分からんが、浮動小数点の例外で、不正確辺りが出たために、
その後の除算結果が、DuronとAthlon64で異なる。 回避するには、fpreset()すること。 どうゆうときに、例外がでたらでDuronとAthlon64で、浮動小数点演算が異なるのかは不明。 追求したい人はやってみて
- 32 名前:デフォルトの名無しさん [2008/01/06(日) 09:41:11 ]
- CreateDIBSection APIで、divide by zero.....................
- 33 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 10:07:29 ]
- >>31
異なるだけじゃ解らないし、試しようがない。 計算内容と真値と実際の計算結果を出してくれなきゃね。
- 34 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 09:14:59 ]
- >からネトゲは、キー入力ではなく、
FPUの問題でないだろ。 >座標を直接送信するか、 >サーバとかの1台のPCで座標を計算する 両者正反対の手法な件
- 35 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 02:46:29 ]
- 残念ながら 200 までさえ持ちそうに無いな、このスレ
- 36 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 09:38:02 ]
- BCDを絡めると盛り上がるよ。
- 37 名前:デフォルトの名無しさん [2008/01/09(水) 20:05:53 ]
- BCDで全桁計算すれば誤差でないよ
- 38 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 21:02:15 ]
- 無限桁ですかw
- 39 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 21:21:19 ]
- >>37
無理に盛り上げないでOK
- 40 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 21:21:40 ]
- (1/3)*3=0.999999999...
- 41 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 22:24:03 ]
- >>14
マダー?
- 42 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 22:31:04 ]
- VC8のlong doubleとBCCのlong doubleなら結果変わるよん
- 43 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 22:44:27 ]
- そりゃコンパイラ変えたら変わったとしてもおかしくないだろ。
- 44 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 22:51:03 ]
- VCのはdoubleと一緒だしなー
- 45 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 22:51:08 ]
- 超越関数とか
- 46 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 05:33:26 ]
- 超越関数いいたいだけちゃうんかと
- 47 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 02:27:21 ]
- 超越関数で思い出したけど、SSEだとソフトウェア計算になるんだよね?
いまだにx87使った方が速かったりする?
- 48 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/01/11(金) 02:33:17 ]
- VCランタイムの数学関数は、普通に内部的にSSE2使ってるよ。使える場合。
超越関数もテーラー展開とかすれば並列処理できる部分があるから その辺は有利に働く。
- 49 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 08:39:43 ]
- >>48
それってsingle精度だけかな。doubleもsingleもFPU使ってて一緒だと思ってdoubleだけ使ってたよ。
- 50 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 11:44:13 ]
- >>48
>超越関数もテーラー展開とかすれば並列処理できる部分があるから 一瞬、 並列処理って SSE2 の並列演算命令を使ってるってこと? それともマルチスレッド? っと思ったんだけど >>49 のレスを見ると前者のことですか。 ちなみに >>49 で single だけってのは double だと並列度が低くてあまり効果がないという ことですか?
- 51 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 15:21:00 ]
- C++でもC99でも、大抵の超越関数はfloat版とdouble版の両方(+long double版)があるから、
今時全部doubleで計算しやしないと思うのだが。
- 52 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 19:23:07 ]
- 数値計算だと float なんか精度低くて使ってられない
- 53 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 19:31:20 ]
- そこはそれ、収束される計算なんかは初めのうちはfloatで充分なのですよ。
# つーか、数値解析でも近似値計算は意外に有用だし。
- 54 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 19:35:28 ]
- >初めのうちは float
なるほど・・・。確かにそれはアリだな。
- 55 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 19:45:43 ]
- >>52
素朴な疑問なんですが、float では精度が足りない、というその基準は何なんでしょうか。 例えば、数値計算において何か不可欠な条件があって、それを実現するために 数値の精度を決定していくと float では足りない、みたいなことになったりしますか?
- 56 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 19:49:08 ]
- >>55
8桁以上まで収束させたり 数百万の値の足し算とかしたりするからね。
- 57 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 20:49:46 ]
- >>56
一行目と二行目はおそらくほとんど同じことを意味していると思いますが (まさか指数部を変化させたくない、なんてことはないですよね) その8桁以上の8ってのは、何か意味付けできるんでしょうかねえ。 数値計算以外で、たとえばコンピュータのモニタの解像度を決めるときの条件として 「文字が普通に読める程度以上の解像度」とか、(無理矢理)意味付けできるわけですが、 数値計算の場合は、どうなのかなあと。
- 58 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 20:55:13 ]
- >>57
2つの計算値の差を求めたいときとか、 差が小さいともの凄く収束させないとあかんのんよ。
- 59 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 21:09:00 ]
- integer, parameter :: wp = selected_real_kind(8)
real(kind=wp) :: x, y, z
- 60 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 04:14:00 ]
- 80bitの演算を使ってちょっと高精度&ちょっと高速をとるか、
あくまでもIEEE754準拠か、それが問題だ。 ある意味、科学者的な考えvsエンジニア的な考え?
- 61 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 04:25:05 ]
- しかしx86のFPUはいちいちメモリとのやりとりが発生するので
メモリ帯域がもろにスピードに効いてくるな。L2が十分に大きければ 問題はないと思うが。 そこへ行くとSSE2はレジスタ内でやりくりできるのでかなりの 速度アップになる。 この気持ち悪いインターフェースは過去の負の遺産ですよね。
- 62 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 04:27:18 ]
- labs.cybozu.co.jp/blog/mitsunari/2007/10/x86.html
- 63 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 10:39:01 ]
- >>61
スタック内で済ませられるよ。
- 64 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 15:00:08 ]
- >>57
マシンイプシロン
- 65 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/01/13(日) 18:35:03 ]
- L2がどうとか(笑)
普通は直接読み書きするメモリはL1だ。
- 66 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 20:20:01 ]
- #include <stdio.h>
#define _DF float #define _FMT "%d %25.22f\n" #define _ONE 1.0f #define _HALF 0.5f int main(int ac, char **av) { _DF x = _ONE; _DF a = _ONE; int i; for(i = 0; (_DF)(x + a) > (_DF)_ONE; i++){ printf(_FMT, i, a); a *= (_DF)_HALF; } } _DFをfloatにしてもdoubleにしても結果が同じです なぜでしょうか?
- 67 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 20:30:07 ]
- >>66
例えばx86におけるfpuのように、floatでもdoubleでも同じ演算ユニットを使うとそうなります。
- 68 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 20:32:22 ]
- >>66
gccなら、-mfpmath=sse にするとどちらも-mfpmath=fpu のときより少ない回数で終了するよ。
- 69 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 21:08:23 ]
- ありがとうございます
cygwinのgcc使ってるんですが -mfpmath=sse -mfpmath=fpu どちらを指定しても最初(なにもしないとき)と結果は同じでした
- 70 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 04:22:38 ]
- >>69
まさか、sseのないCPUって落ち? つーか、-msse(or sse2など) つけてないのかな? 一応こんな感じなんだけど。 -- $ gcc --version gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125) Copyright (C) 2004 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -- $ gcc foo.c -msse2 -mfpmath=sse -- # _DF == float $ ./a|tail -1 23 0.0000001192092895507812 -- # _DF == double $ ./a|tail -1 52 0.0000000000000002220446 -- $ gcc foo.c -- $ ./a|tail -1 63 0.0000000000000000001084
- 71 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/01/14(月) 07:03:53 ]
- >>69
sizeof (float) と sizeof (double) だしてみて 古いコンパイラだとfloat=doubleになる希ガス
- 72 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 09:13:04 ]
- >>66
アンダースコアを先頭に付けた識別子は 処理系の予約語だから(本当はもうちょっと規則が複雑)、 自分で定義しちゃダメ。
- 73 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 23:01:12 ]
- x87は最大66bit精度な訳だが
- 74 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 23:14:45 ]
- >>73
だからなに?
- 75 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 11:35:56 ]
- 愚:だからなに?
平:勉強になりました。 賢:常識じゃね。
- 76 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 11:40:58 ]
- >>75
それで?
- 77 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 13:30:57 ]
- 66bitってどこから出てきたんだ
- 78 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 15:04:15 ]
- 三角関数の引数が範囲内にあれば、自動的に2πの倍数(66ビット精度)に縮小される
πの16進内部値は次の通りである 4 * 0.C90FDAA22168C234C
- 79 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 16:18:47 ]
- なんちゃ、それ。
- 80 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 20:11:24 ]
- そういえば牌の任意の桁が16進表記で判るらしいけど
どんな計算してるんでしょう?
- 81 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 22:49:45 ]
- x87 は仮数部 64 ビットじゃなかったっけ?
しかも暗黙の 1 なしで。
- 82 名前:デフォルトの名無しさん [2008/01/16(水) 00:10:51 ]
- ダンゴさんが連投するスレは活気があるな
- 83 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 16:32:04 ]
- あとx87も普通にIEEE754準拠してる件について
- 84 名前:デフォルトの名無しさん [2008/01/18(金) 17:54:10 ]
- つーか、8087がIEEE754の元になったんじゃなかったっけ?
- 85 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 01:00:35 ]
- だね。
- 86 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 19:15:52 ]
- しかしなんで指数部のゲタが1024じゃなくて1023なんだろ(倍精度)
指数部の最初のビットを見れば1以上か否かわかる、ように した方が美しいと思うんだが
- 87 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 19:27:30 ]
- 奇数じゃないと指数の上限と下限の絶対値が等しくならない
- 88 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 19:29:39 ]
- Infinity/NaN 用のフラグが必要だから
- 89 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 19:38:59 ]
- そもそも浮動小数点というのが分からない
- 90 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 19:43:23 ]
- >>87
ばか?
- 91 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 22:10:51 ]
- 0x400の方が綺麗だよね、1以上の総数と1未満の正数の総数が等しいし。
最小の正数の逆数が飛んでしまうとかそんな理由か。
- 92 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 22:41:46 ]
-
∧∧ ミ _ ドスッ ( ,,)┌─┴┴──┐ / つ ここでBCD.│ 〜′ /´ └─┬┬――┘ ∪ ∪ ││ _ε3
- 93 名前:デフォルトの名無しさん [2008/01/27(日) 00:03:52 ]
- 453 名前: デフォルトの名無しさん 投稿日: 04/08/09 23:53
こんなのでいいか?テンプレ。 >451 Q1. BCDだと誤差出ないよね? A1. ではBCDで1÷3を計算してみよ。 Q2. IEEE754 が 1÷10 を正確に表せないのはけしからん。 A2. 1÷3 を有限桁で表せない10進数もけしからんよね。 Q.3 とにかく浮動小数は誤差が出るって聞いたんだい! A.3 だからといってBCDに誤差が出ないわけではない。 Q.4 キー!でも浮動小数の誤差の出方はわかりづらいだろ! A.4 BCDの誤差の出方よりわかりやすいという職業の人もいる。 Q.5 BCDをバカにするな!金融をバカにするかぁ技術者さんよぉ! A.5 あなたの被害妄想。 続く… 460 名前: デフォルトの名無しさん [sage] 投稿日: 04/08/10 11:53 Q6. バーカバーカ!誤差の許されない分野にBCDが使われてるよ! A6. 本当なの?じゃあBCDを正しく理解できている優秀なSEに感謝しましょう。 Q7. でもでも誤差の許されない分野にBCDが使われてるよ! A7. しつこいね。BCDを使うと誤差を許さなくなるわけではないよ。 Q8. オーゥワタシ、メソポタミアジンデース。ニポンジン10進スキネー。ナゼ? A8. 祖先から伝えられてきた日本の美しい伝統だからです。
- 94 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 00:06:24 ]
- 誤差が嫌なら有理数クラスでも使えばいい。
- 95 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 00:39:27 ]
- BCDで全桁計算すればよいと結論が出尽くしている。
- 96 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 00:43:50 ]
- 1/3
- 97 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 02:18:05 ]
- >>83
IEEE754に準拠したのは80387以降。(80287XLというのも一時期あったらしいが) それまで負の無限大は無かった。 tan91°とかどうしてたのかねぇ。
- 98 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 02:53:44 ]
- ばかだなBCDで扱えない数字はそもそも人間にも扱えない
- 99 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 09:02:07 ]
- 分数で良いじゃん
- 100 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 09:08:41 ]
- SSE4のベンチマークまだー?
- 101 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 10:16:03 ]
- プログラマに数学は必要かという問いに対して別にいらないんじゃね?と思っていたんだが・・・
- 102 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 11:46:35 ]
- >>97
馬鹿が居る。
- 103 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 11:50:25 ]
- >>97 制御ワードの12bit(INFINITY CONTROL)は8087では有効でございます
- 104 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 12:15:40 ]
- >>99
無理数
|

|