1 :
デフォルトの名無しさん :
2008/01/04(金) 14:25:44 主にx86系で浮動小数点を扱う話題
2 :
デフォルトの名無しさん :2008/01/04(金) 14:27:07
CPUごとにFPUの精度の誤差があるって話なんだけど、 Duron,Athlon,PenIII,Pen4,Athlon64,PenD とかで、それぞれどのように違うの?
IEEE754準拠モードを使う限りは、誤差は規格どおりになる。 CSRを操作することで精度度外視で高速動作するモードがある。 命令セットマニュアル嫁
このスレは最初まったく伸びないが、突然ザクザクと1人の書き込みで急に伸びだし、 しかし200レスあたりでネタがつきて、その後はパッタリと伸びなくなる。
5 :
デフォルトの名無しさん :2008/01/05(土) 05:23:34
>>2 デフォの誤差じゃなくて、CPUごとの誤差だよ。
同じ計算してもCPUが違うと結果が異なるって話。
CPU自体の違いだから、ソフトじゃどうにもならないって話
6 :
デフォルトの名無しさん :2008/01/05(土) 05:24:01
IEEE754準拠モード使う限り誤差も規格どおりになるって言ってるだろ。文盲か?
CPUごとの誤差ってのは非IEEE754準拠モードでの話か?
非準拠モードは実装依存の誤差が許容できる用途でだけ使うこと。 それこそ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の浮動小数点コプロ間は、どのぐらい誤差を生じるものなのだろうか。 っていう疑問なんだけど
>という一例があるとして、 はい、ソースの提示を求めます
12 :
デフォルトの名無しさん :2008/01/05(土) 07:37:26
>>11 だから、どうゆう状況でCPU間の誤差が出るか分かってば質問なんかしないって。
どうゆう状況かわからないけど、誤差が出るときがあるんだって。
企業とかでネトゲ造ったことある奴なら知ってることだろ。
だからネトゲは、キー入力ではなく、座標を直接送信するか、
サーバとかの1台のPCで座標を計算する
状況もわからないのにCPUごとに違うなんて信じてるんですか?
14 :
デフォルトの名無しさん :2008/01/05(土) 08:09:35
15 :
デフォルトの名無しさん :2008/01/05(土) 08:16:41
16 :
デフォルトの名無しさん :2008/01/05(土) 09:46:36
あと反日はかかりそう
韓国か
18 :
デフォルトの名無しさん :2008/01/05(土) 10:07:53
北朝鮮じゃね?
うちにあるPentium搭載のマシンならすばらしい結果を出してくれるかも 5年くらい起動していないから動くかどうか怪しいが
>>19 wwwwwwwwwwww
アレのせいで誤解されてるんじゃないのかね
でも問題の初期の奴って回収されたんじゃなかったっけ
22 :
デフォルトの名無しさん :2008/01/05(土) 10:53:41
ついに異なる個所を特定したぞ! 昼にはうぷできるかも
23 :
デフォルトの名無しさん :2008/01/05(土) 10:55:47
切り出してやったら同じだったw。 てことは、その前の浮動小数点演算で、例外が発生してるのかも
x86に限定しないほうがスレ伸びそう
25 :
デフォルトの名無しさん :2008/01/05(土) 12:07:53
他にやることができたので、検証は今晩か明日に
x87命令とSSEとで誤差があるとかいうたわけた話ではなかろうな。
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.....................
>>31 異なるだけじゃ解らないし、試しようがない。
計算内容と真値と実際の計算結果を出してくれなきゃね。
>からネトゲは、キー入力ではなく、 FPUの問題でないだろ。 >座標を直接送信するか、 >サーバとかの1台のPCで座標を計算する 両者正反対の手法な件
残念ながら 200 までさえ持ちそうに無いな、このスレ
BCDを絡めると盛り上がるよ。
37 :
デフォルトの名無しさん :2008/01/09(水) 20:05:53
BCDで全桁計算すれば誤差でないよ
無限桁ですかw
(1/3)*3=0.999999999...
VC8のlong doubleとBCCのlong doubleなら結果変わるよん
そりゃコンパイラ変えたら変わったとしてもおかしくないだろ。
VCのはdoubleと一緒だしなー
超越関数とか
超越関数いいたいだけちゃうんかと
超越関数で思い出したけど、SSEだとソフトウェア計算になるんだよね? いまだにx87使った方が速かったりする?
VCランタイムの数学関数は、普通に内部的にSSE2使ってるよ。使える場合。 超越関数もテーラー展開とかすれば並列処理できる部分があるから その辺は有利に働く。
>>48 それってsingle精度だけかな。doubleもsingleもFPU使ってて一緒だと思ってdoubleだけ使ってたよ。
>>48 >超越関数もテーラー展開とかすれば並列処理できる部分があるから
一瞬、
並列処理って SSE2 の並列演算命令を使ってるってこと? それともマルチスレッド?
っと思ったんだけど
>>49 のレスを見ると前者のことですか。
ちなみに
>>49 で single だけってのは double だと並列度が低くてあまり効果がないという
ことですか?
C++でもC99でも、大抵の超越関数はfloat版とdouble版の両方(+long double版)があるから、 今時全部doubleで計算しやしないと思うのだが。
数値計算だと float なんか精度低くて使ってられない
そこはそれ、収束される計算なんかは初めのうちはfloatで充分なのですよ。 # つーか、数値解析でも近似値計算は意外に有用だし。
>初めのうちは float なるほど・・・。確かにそれはアリだな。
>>52 素朴な疑問なんですが、float では精度が足りない、というその基準は何なんでしょうか。
例えば、数値計算において何か不可欠な条件があって、それを実現するために
数値の精度を決定していくと float では足りない、みたいなことになったりしますか?
>>55 8桁以上まで収束させたり
数百万の値の足し算とかしたりするからね。
>>56 一行目と二行目はおそらくほとんど同じことを意味していると思いますが
(まさか指数部を変化させたくない、なんてことはないですよね)
その8桁以上の8ってのは、何か意味付けできるんでしょうかねえ。
数値計算以外で、たとえばコンピュータのモニタの解像度を決めるときの条件として
「文字が普通に読める程度以上の解像度」とか、(無理矢理)意味付けできるわけですが、
数値計算の場合は、どうなのかなあと。
>>57 2つの計算値の差を求めたいときとか、
差が小さいともの凄く収束させないとあかんのんよ。
integer, parameter :: wp = selected_real_kind(8) real(kind=wp) :: x, y, z
80bitの演算を使ってちょっと高精度&ちょっと高速をとるか、 あくまでもIEEE754準拠か、それが問題だ。 ある意味、科学者的な考えvsエンジニア的な考え?
しかしx86のFPUはいちいちメモリとのやりとりが発生するので メモリ帯域がもろにスピードに効いてくるな。L2が十分に大きければ 問題はないと思うが。 そこへ行くとSSE2はレジスタ内でやりくりできるのでかなりの 速度アップになる。 この気持ち悪いインターフェースは過去の負の遺産ですよね。
L2がどうとか(笑) 普通は直接読み書きするメモリはL1だ。
#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にしても結果が同じです なぜでしょうか?
>>66 例えばx86におけるfpuのように、floatでもdoubleでも同じ演算ユニットを使うとそうなります。
>>66 gccなら、-mfpmath=sse にするとどちらも-mfpmath=fpu のときより少ない回数で終了するよ。
ありがとうございます cygwinのgcc使ってるんですが -mfpmath=sse -mfpmath=fpu どちらを指定しても最初(なにもしないとき)と結果は同じでした
>>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
>>69 sizeof (float) と sizeof (double) だしてみて
古いコンパイラだとfloat=doubleになる希ガス
>>66 アンダースコアを先頭に付けた識別子は
処理系の予約語だから(本当はもうちょっと規則が複雑)、
自分で定義しちゃダメ。
x87は最大66bit精度な訳だが
愚:だからなに? 平:勉強になりました。 賢:常識じゃね。
66bitってどこから出てきたんだ
三角関数の引数が範囲内にあれば、自動的に2πの倍数(66ビット精度)に縮小される πの16進内部値は次の通りである 4 * 0.C90FDAA22168C234C
なんちゃ、それ。
そういえば牌の任意の桁が16進表記で判るらしいけど どんな計算してるんでしょう?
x87 は仮数部 64 ビットじゃなかったっけ? しかも暗黙の 1 なしで。
82 :
デフォルトの名無しさん :2008/01/16(水) 00:10:51
ダンゴさんが連投するスレは活気があるな
あとx87も普通にIEEE754準拠してる件について
84 :
デフォルトの名無しさん :2008/01/18(金) 17:54:10
つーか、8087がIEEE754の元になったんじゃなかったっけ?
だね。
しかしなんで指数部のゲタが1024じゃなくて1023なんだろ(倍精度) 指数部の最初のビットを見れば1以上か否かわかる、ように した方が美しいと思うんだが
奇数じゃないと指数の上限と下限の絶対値が等しくならない
Infinity/NaN 用のフラグが必要だから
そもそも浮動小数点というのが分からない
0x400の方が綺麗だよね、1以上の総数と1未満の正数の総数が等しいし。 最小の正数の逆数が飛んでしまうとかそんな理由か。
∧∧ ミ _ ドスッ ( ,,)┌─┴┴──┐ / つ ここで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. 祖先から伝えられてきた日本の美しい伝統だからです。
誤差が嫌なら有理数クラスでも使えばいい。
BCDで全桁計算すればよいと結論が出尽くしている。
1/3
>>83 IEEE754に準拠したのは80387以降。(80287XLというのも一時期あったらしいが)
それまで負の無限大は無かった。
tan91°とかどうしてたのかねぇ。
ばかだなBCDで扱えない数字はそもそも人間にも扱えない
分数で良いじゃん
SSE4のベンチマークまだー?
プログラマに数学は必要かという問いに対して別にいらないんじゃね?と思っていたんだが・・・
>>97 制御ワードの12bit(INFINITY CONTROL)は8087では有効でございます
80287と80287XLはパフォーマンスの向上以外には具体的にはどのような非互換性があるんだろう
多倍長計算とBCD計算の違いについて教えてください
BCD は 1 桁を 0〜9 で扱う。 多倍長計算はそういう制限がない。
BCDの多倍長は?
BCD は BCD 用の命令が CPU に備わってることがある。
>>86 整数命令で大小判定できるからじゃん?
バイアスでなくて2の補数とかにしたい気持ちはよく解るが。
DAAとかx86_64では無くなってるんでしょ?
MSX-BASICの浮動小数点 符号部 ibit 指数部 7bit 0x40のげた付き10のべき 仮数部 短精度 24bit 倍精度 56bit 正規化されたBCD(6桁/14桁)
>>111 >
>>86 > 整数命令で大小判定できるからじゃん?
それはゲタが1024だとできないの?
>>111 2の補数用の比較命令使いたかったらまず仮数部をだな
windowsの電卓オススメ
>>117 >windowsの電卓オススメ
ヘルプによると一部有理数を使えるようだな。感心感心。
がしかし、関数電卓にすると平方根ボタンが消えるのはなぜだ?
どうやら平方根は関数ではないらしい。
[x^2]の逆関数で何とかしのげるが。
1/2乗って知ってる
x^2 の逆関数でいけるからボタンが無いんだよ
x^yの意味がわかってないな
XOR だよね!
そうだね累乗はx**yだね
もれは1/2計算するの面倒だから .5乗している
ActiveScriptRubyについてるirbが便利。
[3][x^y][1][.][5][=] [3][Inv][x^2]
普通の電卓に平方根がついてる意味がわからん。標準偏差に使うのか? 簡単なループで計算できるからつけてみたら、その後ほぼ標準装備になったとか?
>>117 浮動小数点は文字列を使えという主張ですか
0.1が正確に表現できるって意味じゃないか
BCD最強説
BCDは固定長です。
COBOLのパック形式をBCDと呼ぶのが正しいのだろうけど、 仮数部 X 10の指数部乗 の形式や 小数点以上32bit+小数点以下32bitといった10進数の表現も多い。
BCD で可変長は可能だろ。
>>117 Windowsの電卓をコマンドラインから実行して計算結果をもらうにはどうすればよいのでしょう?
∧∧ ミ _ ドスッ ( ,,)┌─┴┴─────────┐ / つ ここでユークリッドの互除法. │ 〜′ /´ └─┬┬―───────―┘ ∪ ∪ ││ _ε3
137 :
デフォルトの名無しさん :2008/02/10(日) 11:54:35
>>103 8087 デフォルトの射影的無限大ってよく解らないんだけど。
Projective モードで tan(90.000・・・°) を計算すると、
無限大の符号はどっち向くの?
(90.000・・・°のラジアンは表現できない 8087FPTANのパラメータは[0, π/4)の範囲 8087デフォルトでは-∞と+∞の相違は意味が無い(+0,-0と同様) 実際には、80bit-->64bitの変換で色々起こると思う
BCD信者に 89.999… == 90.000… が真であることを証明してもらおうか。
IEEE754信者も
IEEE754に循環小数は存在しませんっ。 先生そんなの認めませんっ。 無限桁BCDは世界最強なんだろ? 手始めに等号判定を実装してもらおうじゃないのさ。 アルゴリズムだけでもいいから示してくれ。 等号すら満足に行えない数値表記なんて何の役に立つ?
有限桁演算だと結局等号の意味が薄い件
マシンイプシロンくらい気にしろと
じっすうのひかくにとうごうをつかっちゃいけないって おかあさんがゆってた
>>144 ではどうしろと?
A-Bが0だからといってA==Bとは限らない。
ママにそういってこい。
>>145 どうもこうも、不等号を使うしかないだろ。
差が何らかの閾値以下かどうかチェックするのが常套手段
>>147 そうそう、マシンイプシロンあたりで。宿題スレでよくみます。
>>143 >>148 マシンイプシロンと等号になんの関係が?
まさか、まさかとは思うが、君達は A==B を判定するのに A÷B させて1.0に迫るのを眺めているわけではないよな?
マシンイプシロンの精度で数値解析できれば苦労しないw
まさにA==Bを判定する必要がある場面を例示せよ。 行列ならほとんど積和算だし ソートは大小比較であり等号なんて使わない。 もしかして実数データをstable sortでもしたいのかい?
Aさんが直線上を時速2キロで歩いています。 Aさんの5キロ後方のBさんが時速3キロでAさんを追いかけ始めました。 おっと、A,B間を往復する時速5キロの犬が同時にBさんのもとを出発しました。 さて、ここで問題です。 (続く)
私が博士論文で作った無限桁BCDライブラリによるとだな。 永遠にアキレスは亀に追いつけないと結論が出ておる。 よって常にA≠B。犬は老衰で死ぬ。
IEEE754 と微分方程式によるとだな、そもそもNot a Number(数ではない)と結論が出ておる。 もしかして犬は虚数なんじゃね?
……AとBが出会った瞬間犬はどっちを向いているでしょうか?
>>151 ほぼ 0 を 0 に切り捨てる処理を書く事はたまにある。
ほぼ0なベクトルが与えられる可能性のあるときにを単位ベクトルに正規化するとき悩むな。 分岐を使わないいいい方法ってないかな?
どうせ長さ取得する必要があるんだし 分岐したんでいいんじゃないかな。
>>155 そりゃあ「尻尾の反対側」だろうな。
なんたって虚数犬だからな。
BがAを追い越した10分後にどっち向いてるかも興味があるな。
>>157 まずベクトルの要素の中から一番デカい数値を探すんだ。
そしたらそいつが1.0になるように他の全要素をスケーリングする。
ここまでは簡単だろ?n次元ベクトルならn-1回の比較とn回の割り算をすれば済む話だ。
できたか?できたら後はフツーに単位ベクトルを得るがよろし。二乗や平方根が出てくるだろうが、もはや二乗によるオーバーフローや平方根によるアンダーフローの危険性はぐっと減るはず。
まあようするにアレだ。単位球を得る前に、外接する立方体(一辺の長さは2.0な)を一度求めてみましょうという話だ。
…という仕事を昔データマイニングでしたなあ。
小さい数値が出てきてる時点で、 そのベクトルを求める際に 数値誤差がたんまり入ってる恐れがあるじゃん。 全体的なオーダーが小さい場合はそういう手法は役に立つと思うけど、 例えば 1 前後のオーダーが普通な時に 10^-14 みたいなサイズのベクトルがあったら それは多分もの凄い勢いで数値誤差を含んでる。 困るのは多分こういう時。
>>161 > 例えば 1 前後のオーダーが普通な時に
> 10^-14 みたいなサイズのベクトルがあったら
> それは多分もの凄い勢いで数値誤差を含んでる。
うーん、そういうものなの?誤差?物理とか計測の話だったの?
データマイニングで言うとこんなケースかな。(単精度正規数の場合ね)
あるとこにおでん屋さんがいました。
店長はベクトル(気温,売上高)を使ったデータマイニングで仕入れ管理を始めました。
「まあ大変。昨日まで1℃だった気温が突然1.17549435e-38℃よ!氷点下はまぬがれたけどシステムがSIGFPEを吐いて止まってしまったわ!」
さあどうしよう。そうだ!気温をセ氏からカ氏に変えたらいいのでは?
過去のデータは全て変換して、今日の気温32°Fっと…うまくいったようです!
ということで、物理屋の諸君も単位を柔軟に変えてみることをお薦めしたい。
特に零点変更は効果的だ。
興味深い話だ。
いま
>>4 の第二フェーズあたりだな。このスレはここからがおもしろい。
摂氏0℃付近になる事で問題が発生する状況が想像できないなあ。
もの凄く小さいベクトルは何らかの形で数値誤差が大きいかもしれないから、 それを正規化して果たしてどれだけの意味があるのか分からない、 ってのがあるんだよな。 演算でオーバーフローとか現れなかったとしても、 そうやって得たベクトルに意味はあるの? ってところ。 解析的に解くと、(もの凄く小さいながらも)とある方向を向いているはずなのに、 数値誤差のせいで別の方向を向いてるなんてことは普通にある。 そういうのはばさっと0ベクトル扱いにするのもありだと思うが、 全体のオーダーが小さい場合もあるかもしれないから、 どこから0ベクトル扱いにしていい物やら悩む。
摂氏-1度の氷に摂氏-1度の水を掛けると……
温度なんて相対値か絶対温度の形でしか 式に現れないはずだからなあ。 原点が問題になることは無いはず。
「ただ1回計算をしただけでは結果の正しさについてほとんど何もわからない」 (伊理,藤野:"数値計算の常識")
ただ1個の標本だけでは母集団の分散について何も言うことができない
おでんやの店長(>162)です。 あたしはねぇ、気温を入力して売り上げが予想できればそれでいいの。 工学科卒のオーナーったらひどいのよ。 こないだの大晦日とか、気温も売り上げも0に近かったんだけど、 「何らかの形で数値誤差が大きいかもしれない」とか言い出すのよ!もー! 「それを正規化して果たしてどれだけの」やかましいわ、キー! あたしは一生懸命打ち込んでるの!気温が低いのも売り上げが伸びないのもれっきとした「事実」なの!暖かろうが寒かろうが「事実」に貴賎はないの! >168 >「ただ1回計算をしただけでは結果の正しさについてほとんど何もわからない」 何回計算させれば気が済むのよ!あたしはデートなの。もう後がないのよ! もういいわ。ム板に相談した私がバカだった。 ケルビン温度計買ってくるわ。そうすればあたしは幸せになれるのよね? どこで売ってるの?Amazon?楽天? …もし気温が0°Kになったらどうするかですって? そしたらまたセ氏に戻すわ。
>170 あなたが観測した気温が1.17549435e-38℃だったとして、 実際には温度計の目盛り線がちょっと曲がっていて 本当の気温はマイナス1.17549435e-38℃だったかも しれない。でここに出てくる数字だけから判断すると 相対誤差200%なんていう話になってしまう。 売り上げ予想は「事実」ではないでしょ? 入力する気温が氷点下かどうかで 「今月は赤字に転落する恐れがあります」なんて オーナーに報告しに行かなければならなくなる瀬戸際 にあなたは立っているかもしれない。 真冬日の定義に従って 「今シーズンの暖冬傾向は云々」という文章を 書くのを仕事としている気象庁の中の人は リアルでそういう状況なんじゃないかな。
>しれない。でここに出てくる数字だけから判断すると >相対誤差200%なんていう話になってしまう。 ならねーよ (273.15 - 1.17549435e-38) 〜 (273.15 + 1.17549435e-38) だから誤差は0でいいよ
>172 だからー、170の使ってる予測式が 気温(セ氏度)×1万円 だったらどうすんの?て話。 物理だけが数学じゃねーぞ。 水と氷だって大違いだぞ。 >173 ここでは相対誤差でなく絶対誤差を使うのが大人のたしなみ。 こうですか分かりません!
>>174 1万円かけたところで誤差なんてないじゃん。
そもそも 「何との」 相対誤差を出したいんだ?
1.17549435e-34円も-1.17549435e-34円も 四捨五入すれば0円か…その通りだ 真の値と測定値との間の誤差…セ氏度表示で ってダメ?
そんなことより >157 よ、聞いてくれ。(>161、>165 も同類か?) おでん屋のオーナーもよく聞きなさい。 ベクトルの大小はものの本質ではない。扱うベクトルが小さいからといって天文学者が量子力学者を馬鹿にするような行動は慎まねばならぬ。スケールの大小と精度の長さは区別せねばな。 >161 > 例えば 1 前後のオーダーが普通な時に > 10^-14 みたいなサイズのベクトルがあったら > それは多分もの凄い勢いで数値誤差を含んでる。 IEEE754単精度では1〜10^-37ぐらいを同じ精度で計算するのは朝飯前じゃがのう。 >165 > もの凄く小さいベクトルは何らかの形で数値誤差が大きいかもしれないから、 量子力学者のベクトル計算は天文学者より数値誤差が大きいとでもいうのかね? > 数値誤差のせいで別の方向を向いてるなんてことは普通にある。 で、何に困ってるのかね?おでん屋のお姉ちゃんを見習って温度計を買い換えたらどうかの?ベクトル要素の性質と単位ベクトルの用途を聞かんことにはなんとも答えられんのう。 > どこから0ベクトル扱いにしていい物やら悩む。 これこれ、あくまでも目的は単位ベクトルじゃ。そうじゃったよな? >157 という訳で状況を確認させてもらおう。状況が解らない以上、>157 には最大公約数的な答えしか返ってこないじゃろうな。多目的用途のデータマイニング屋さんのように。 ・「ほぼ0」ってどれぐらい?0.01ぐらい? ・ベクトル要素の単位は何?質量?気温?無次元数?IPアドレス? ・ベクトル要素のソースは何?計算結果?計測器?物理定数? ・単位ベクトルを得る目的は? ・当然浮動小数点だよな?
>IEEE754単精度では1〜10^-37ぐらいを同じ精度で計算するのは朝飯前じゃがのう。 よくわからないけど、 1.0 + 1.0 * 10^-37 が正確に計算できるってこと?
>>178 うむ、この程度の計算なら0.5ulpのハードルはらくらくクリアだな。
その計算は仮数部が128ビット以上必要だろJK
ビックリするかもしれないが、0.5ulpさえクリアすればそれが「正確」というものなのだよ…
>180 キミは禁断の「真実の値」に迫りたいのかい? 恐ろしいことに、このケースでは仮数部は何桁あっても足りないのだよ… こうして毎日何人ものプログラマーがBCDの暗黒面に落ちていくのだよ…
>181 情報落ちは言い出した人の責任ですかそうですか >182 1.0 * 10^-37 を「有効数字2桁?」と考えた上での発言だ …前半の1.0のほうを忘れてたなそういえば
10^-1に仮数部が何bit必要か計算してごらん… おのずと1.0+1.0*10^-37の正体にも気付くさ… >こうして毎日何人ものプログラマーがBCDの暗黒面に落ちていくのだよ… やがて彼らは新天地で1÷3に出くわし、挫折の末、戻ってくるのさ… そして望む/望まざるに関わらず >181 を受け入れて生きていくしかないのだよ…クククッ
そこで分数表現が登場
ライブラリの中の人が10進2進変換に苦労してることも 知ってるし。だ れ が 1.0+1.0*10^-37の「真実の値」を 知りたいと言ったか。 分数は大小比較が困難だからなー。循環小数について 考えてみようよ。 手始めに0.111...と1.000...をどう正規化するかについて。
循環小数は分数化できるよ 0.900900900900.... = 900/999 0.90909090.... = 90/99 0.9999.... = 9/9 = 1/1 大小比較は通分すればいいんじゃない
分数を循環小数形式で格納する利点は無いものですかね
さあ、πを正確に小数で表現してください。
レベル低すぎ 厨房が涌いてるのか?
191 :
デフォルトの名無しさん :2008/02/21(木) 00:54:42
> 10^-1に仮数部が何bit必要か計算してごらん… > おのずと1.0+1.0*10^-37の正体にも気付くさ… うーん、待ってくれ。 「n^-a を適当な基数で基数変換して循環小数になったら n^-(a+1) の基数変換もまた循環小数である」 …これ、正しいよな? 「整数+循環小数もまた循環小数である」これも確かだよな?
>>177 > > もの凄く小さいベクトルは何らかの形で数値誤差が大きいかもしれないから、
> 量子力学者のベクトル計算は天文学者より数値誤差が大きいとでもいうのかね?
全体的にオーダーが小さい場合は問題ないと何度も言ってるのに
何でそう言う事言うかね。
> > 数値誤差のせいで別の方向を向いてるなんてことは普通にある。
> で、何に困ってるのかね?おでん屋のお姉ちゃんを見習って温度計を買い換えたらどうかの?
> ベクトル要素の性質と単位ベクトルの用途を聞かんことにはなんとも答えられんのう。
そもそも温度計の話も意味が分からない。
「ほぼ0の値になるとおかしなことになる状況だ」 という状況説明が何もない。
気温(摂氏)で割ってるような式でもあるのか?
それを華氏に直して意味はあるのか?
元の式を変える事ができないなら、
いくらデータを保持する時の尺度を変えようが、
結局もとの形式に変換しないと元の式には適用できない。
数値誤差が増えるだけの愚行。
それができるのは元の式を変える事ができる場合だけだが、
それなら別にデータをコンバートする必要も無く、式を変えればいいだけ。
> > どこから0ベクトル扱いにしていい物やら悩む。
> これこれ、あくまでも目的は単位ベクトルじゃ。そうじゃったよな? >157
例えば解析的には0ベクトルになるはずのものが
数値誤差で非0ベクトルになった場合もあるだろう。
そういう場合に単位ベクトルを得て何の意味があるのか?
意味がないなら0ベクトルになっても構うまい(場合によっては例外投げても構わん)。
>>188 あんま無いよ、どうせやるなら同次型にして取り扱うが吉
速くて誤差なし
>>178 おまえw 気をつけろw
>>177 のいう事信じるなwww
ちょっとでも数値計算したことあれば、言ってることが嘘だと分かる。
確かに単精度で表される最小数値は10^-37程度だが、有効桁は仮数部できまるので
1程度の量と混ぜたら、単精度では10^-7程度の誤差が出る。
小学生的なイメージで言えば、浮動小数点では数直線を対数的にメッシュで切っているので、
0近辺では目が細かくて10^-37程度だが、1の近辺では目が粗くなっていて10^-7程度でメッシュが
切られている。だから、これ以上細かい数値を足し引きしても、近場のメッシュに寄せられてしまうので
(寄せ方は切り上げ切捨て、四捨五入(しかも色々ある)などIEEE745の規格で決まった寄せ方を
フラグで指定してやれる。SSEとかはこの辺をきちんとやってない。)
1近辺では10^-7以下の数値は意味を持たない。
これは、浮動小数点をよく知らぬまま数値計算をやっていても、結果を吟味する段階で必ず出会うことなので、
浮動小数点の仕組みを知らなくても、単精度は10^-7~8、倍精度は10^-14~15などという事は、嫌でも体で覚える。
この点からして、
>>177 は計算しない素人評論家もしくはアホ。相手にするな。
なんかこのスレグダグダすぎてワロタ。
>194
>確かに単精度で表される最小数値は10^-37程度だが、有効桁は仮数部できまるので
>1程度の量と混ぜたら、単精度では10^-7程度の誤差が出る。
出ねーよwww
1 に 10^-37 足したら誤差が 0.0000001 ってどこの電卓だよ! ハライテー
>0近辺では目が細かくて10^-37程度だが、
正規数オンリーでも10^-43(≒2^-149)ぐらい楽勝だろうが。
あのさぁ、最小値=最小の刻み幅とか勘違いしてない?
>この点からして、
>>177 は計算しない素人評論家もしくはアホ。相手にするな。
「1〜10^-37ぐらいを同じ精度で計算するのは朝飯前」
被加数:1.000000 (精度7桁)
加数:1.000000 * 10^-37 (精度7桁)
合計:1.000000 (精度7桁)
何か問題あるわけ?
[悪い例] float温度[℃]に 3 << 22 を加えた後、3 << 22を引けば整数化される。 1 << 23個の1円玉(約1g)のfloat重さを加算した後で平均をとる。 >>おでんや x87CWのUM,DMをセットするか例外ハンドラをつけるべき
>>196 その加算で精度7ケタに丸められることを
194は10^-7程度の誤差と言っているのでは?
>194 そんなレベルの議論は>181>183で終わっているように見える >196 0.5ulpの意味でベストを尽くすこととそれに意味があるかどうか ということは別の問題だ 1と1+10^-8を区別できない状況で誤差が10^-37程度だなんて 主張したかったらもっと筋道立てて説明しろ あと >「1〜10^-37ぐらいを同じ精度で計算するのは朝飯前」 の意味をもう少し具体的に書け どんな元データからどういう計算をしようとしてるのかを
もし次スレが立つ様ならスレタイにくだすれって入れとけよ
>>191 10進数で1/3=0.3333333333…は3進数では0.1だ。
>よくわからないけど、 1.0 + 1.0 * 10^-37 が正確に計算できるってこと?
「よくわからない」ふりして指数域の問題に見せかけつつさりげなく循環小数を忍ばせてIEEE陣営の内ゲバを狙う
>>178 よ…恐ろしい奴だ。BCD陣営の刺客か?俺も釣られるところだったぜ…
>1 に 10^-37 足したら誤差が 0.0000001 ってどこの電卓だよ! ハライテー
>>196 よ、知恵を付けた
>>194 が「round toward +INFINITYモードだい!」と屁理屈こねて反撃してくる可能性に気をつけろ。0.5ulpの威光も吹っ飛ぶぜ。
>>「1〜10^-37ぐらいを同じ精度で計算するのは朝飯前」
>の意味をもう少し具体的に書け
>どんな元データからどういう計算をしようとしてるのかを
じいさんはそれを
>>157 に確認してる最中なんじゃねぇの?
このスレの迷走っぷりに呆れて157ももう戻ってこないんじゃないかと。
> 例えば 1 前後のオーダーが普通な時に
> 10^-14 みたいなサイズのベクトルがあったら
> それは多分もの凄い勢いで数値誤差を含んでる。
俺もなぜこの程度の指数域で精度不信に陥ったのか事情を知りたい。
想像だけど、計測値を補間する場合はそんなことが起きる。 回転しないはずなのに微量の回転とか。
もうそろそろネタがつきる頃だな。
206 :
デフォルトの名無しさん :2008/02/21(木) 22:40:47
>>203 機械εが10^-16前後だから
1 前後の値を数百数千数万数十万といった加減算をやってりゃ
10^-14 程度の数値誤差はあって当然。
倍精度での話な。
>>196 あのさぁー
あんた誤差とか有効桁の意味分かってないだろ?
>正規数オンリーでも10^-43(≒2^-149)ぐらい楽勝だろうが。
あのさーwww
あんたさー正規数と非正規数の違い分かってないだろ。
あのさぁーwwww
実地で数値計算をしていれば最小値とか誤差ぐらい誰でも知ってることだよ。
あんた、ただ規格ちょっとかじり読んで得意になってるだけのおっちょこちょいのトーシロさん?
>「1〜10^-37ぐらいを同じ精度で計算するのは朝飯前」
>被加数:1.000000 (精度7桁)
> 加数:1.000000 * 10^-37 (精度7桁)
> 合計:1.000000 (精度7桁)
>
>何か問題あるわけ?
あのさぁーwwwwwwwwwwwwwwwww
> 2008/02/21(木) 13:03:42
ひょっとして、あんた昼間っから酒飲んで酔っ払ってない?
まさか素面で真面目に書いてないよね?
>>203 >>196 の自演?pupupu
自称データマイニング屋のせいで糞スレ化してしまったな。
的確すぎて泣けた
ここまで全部
>>4 による自作自演なんじゃないかと思えるほどぴったりだな。
誤差はちゃんと高校で教えるはずなのに まともに教える学校が少ないのかな。 俺も大学の物理実験ではじめてまともにやったよ。
判りやすく仮数部は2進表記な。
最小の単精度正規数
1.00000000000000000000000 × 2^(-126)
次に小さな単精度正規数
1.00000000000000000000001 × 2^(-126)
その差
0.00000000000000000000001 × 2^(-126)
差を正規化して
1.0 × 2^(-149) ≒ 1.4 × 10^(-45)
奇しくもこれって非正規数の最小値と一致するのな。
>>209 はその辺読み違えたのかと。だよな?
さて、
>>194 (=
>>209 ?) の番だよ。
>0近辺では目が細かくて10^-37程度だが、
>1の近辺では目が粗くなっていて10^-7程度でメッシュが切られている。
10^-37 の算出根拠を示してください。
>>207 > 10^-14 程度の数値誤差はあって当然。
「誤差が10^-14」ってどこから出てきた話よ。
> 10^-14 みたいなサイズのベクトル
の要素の誤差が10^-14なのか?もしそうならこれはひどすぎる。
>>215 それは評判の悪い漸次的アンダーフローの場合だろwwwww
その2数で差を取ったら非正規数になり結局0.0になる。
実際には10^-45という非正規数は見ることは無いんだよ。
大体これは実際に数値計算をしていれば分かること。
プログラム動かして、IEEE754単精度で1.0e-45だのの数字を見たことあるかよ?
要するに、お前がやってるのは、布団海水浴なんだよ。布団の上で水泳ごっこしてるのと同じなんだよ!
規格だけ見てワーワー言ってるから、頓珍漢なことを言うんだ。
2chで遊んでないで、ちゃんとプログラム組んで計算しろ!
おや、これはなんだろう。 -- awk 'END {printf("%c%c%c%c", 1, 0, 0, 0);}'|od -t f4 -- 私にはIEE754単精度の約1.4e-45に見えるのだが。
>>216 > > 10^-14 程度の数値誤差はあって当然。
> 「誤差が10^-14」ってどこから出てきた話よ。
常に O(1) の値を扱って、
それらが全て循環小数なり無限小数なりなら、
100 回の加減算で誤差は機械εの 100 倍のオーダー、
つまり O(10^-14) になる。
しかし実際には、
常に循環小数なり無限小数なりにならないかもしれないし、
常に O(1) ってことはないかもしれないし、
実践的には O(10^-14) ということはないかもしれない。
もっと早く O(10^-14) に達するかもしれないし、
もっと遅く O(10^-14) に達するかもしれない。
> 10^-14 みたいなサイズのベクトル
そんな感じの計算をそんくらいの回数だけ計算をした場合、
10^-14 は数値誤差と同程度のオーダーのベクトルだから、
1桁目にも数値誤差がてんこもりの恐れがあるってことだ。
実際、そういう感じの計算を行った場合、
O(10^-14) のベクトルの向きは当てにならない。
× 10^-14 は数値誤差と同程度のオーダーのベクトルだから、 ○ O(10^-14) のベクトルは数値誤差と同程度のオーダーのベクトルだから、
で、結局、IEEE754単精度正規数の最小ステップ長は誰が正しいんだよ。 ・10^-37程度 ・10^-43ぐらい楽勝 ・≒1.4*10^-45
>>218 ワロタw それは非正規数だしwww 弁当まじりの茶吹いたwwwww
odのf4フォーマットは非正規数をベタで出せてよかったねwww
えらいえらい見えた!見えた!
単精度実数での数値計算の誤差を踏まえた話をしてるんじゃ無かったのかよ。
好きなビット列と好きな浮動小数点フォーマットでへんちくりんな数を出して遊んでるなら、
次はIBMの16進形式で頼むわwwww
”あのさぁー”wwwwww
0.0の次の正規数は約10^-38で、この間隔の方が現実の数値誤差には重要なんですよぉー。
実地であらわれるコンテキスト上の意味も分からないまま、フォーマット規約だけを見て自慰行為に
ふけりまくってるオナニー猿には関係ないだろうがなw
>>221 単独で取り出せる正の数の最小値はおおよそ1e-38。
一般的に原点近傍の数値間隔といえばこれを指すと思う。
ただ仮数部の桁が7~8桁あるので、その上近傍で仮数部の一番下の桁を見れば
1e-7~8 * 1e-38 = 1e-45 程度の丸め誤差におさまっている。
>222 >0.0の次の正規数は約10^-38で、この間隔の方が現実の数値誤差には重要なんですよぉー。 どういう意味で?どこの現実で? 非正規化数が定義された意味をきちんと勉強しろ。 非正規化数がないとか演算速度が重要な実地ならそう書け。 >223 非正規化数って聞いたことない? 聞いたことのない単語が出てきたらググって調べない?
あるのは分かっているし、なくなってしまえばいいとも思わないけど、 実際のところ、あっても嬉しくない。
> 0.0の次の正規数は約10^-38で、この間隔の方が現実の数値誤差には重要なんですよぉー。
「実地であらわれるコンテキストw」の提示内容によっては同意してもいいぜw。
だがしかし、
>>194 の抱く「小学生のイメージ」像に矯正が必要な件はこれとは別だぜwww。
>>219 俺にも詳しく。具体例で。
・O(1)のベクトルA:(1.2, 2.3) ※ いずれの要素も有効桁16
・O(10^-14)のベクトルB:(1.1e-14, 4.5e-14) ※ いずれの要素も有効桁16
があったとしよう。この時点でBの単位ベクトルを求めても文句ないよな?
↓
ベクトルAでもの凄い計算
↓
・ベクトルA':(2.46...1, 3.96...7) ※ 有効桁14に減少
・ベクトルB:(1.1e-14, 4.5e-14) ※ やっぱり有効桁16
ここまではいいんだよな?
さてと、ここから「O(10^-14)で有効桁1のベクトルC」が登場するまでのシナリオが思いうかばねぇ。
> O(10^-14) のベクトルは数値誤差と同程度のオーダーのベクトルだから、
> 1桁目にも数値誤差がてんこもりの恐れがあるってことだ。
てのはそういうことだよな?
あるいは既にベクトルA'の一部に、O(10^-14)で有効桁14な要素が出現してたりするのか?…
とりあえず全ベクトルの全要素は同じ単位の比例尺度で、ベクトル間要素間の加減乗除何でもアリというシナリオルールにしておこう。温度計(間隔尺度シバリ)の話はとりあえず後回しだ。
>>227 O(1) の近い値のベクトル同士を減算すれば
おもっくそ桁落ちする。
こういうことか。 ・O(1)のベクトルA1:(1.2, 2.3) ※ 有効桁16 ・O(1)のベクトルA2:(2.6, 3.1) ※ 有効桁16 ↓ ベクトルA1,A2でもの凄い計算 ↓ ・ベクトルA1':(2.46...1, 3.96...7) ※ 有効桁14 ・ベクトルA2':(2.46...2, 3.96...6) ※ 有効桁14 ↓ ベクトル C=A1'-A2' を計算。 ↓ ・ベクトルC:(-1e-13, 1e-13) ※ 有効桁1 ・ベクトルCの単位ベクトル:(-1, 1) ※ 有効桁1以下w
実際数値計算やってたらそういう状況は起こる。 たとえば基底関数展開したベクトル関数の ある点の値を取得しようとすると、 対称性のおかげで0ベクトルになる点やその付近で そういう状況に陥ることがある。
>単位ベクトル:(-1, 1) 1/sqrt(2)の間違いな。
>>224 おまえと
>>229 は別人なのか、同一人物の自演なのか?www二匹も馬鹿が釣れたのか。
非正規化数の定義された意味を勉強するのはお前のほうだ。
Kahanのサイトに行って、70年代からの苦労話を読み直して来い!
非正規化数を正規化数と同じに考えているところからして、お前は根本から間違っているんだよ。
大体ようやくここ10年くらいでIEEE754の数値Formatは普及したが、丸めやら非正規化数の扱いなんかを
完全準拠している処理系はむしろ例外的だろ。
CELL(SPE)とかGPUの類も非正規化数とかまともにやってないだろ。
SunのSPARCも対応していなくてソフトウェアで対応してたろが。
(この辺は、記憶が曖昧だから検証はマニアさんに任せるよw)
さて、数直線のイメージが理解できないようだから、幼稚園児にも分かるようにより程度を下げて
説明してやる。感謝しろ。
浮動小数点の正規数は、おおよそ対数メッシュになっている。これは指数部に拠るものである。
これは定規で長い線で引かれている目盛りのようなものだ。
さらにこの対数目盛りの間に細かい目盛りが等間隔で引かれている。これは仮数部によるものだ。
0近傍を見ると、最小の正規数までの間には正規数の細かい目盛りは無い。空白地帯がある。
IEEE754規格はここに非正規数を置いているが、この部分は処理系に依存するので、
浮動小数点を学び始めた人は正規数のみのイメージを作るほうが適切だ。
それに、そもそも話は正規数の範囲だったしな。
>>229 お前は桁落ちも知らないで浮動小数点に粘着しているのかwwwwww
subnormalなnumberをいじるより、そのsubnormalなお前の知性を何とかしろ。
俗人のくせに神学に興味を示すのは狂気のプレリュードというが、
数値計算もしないのに浮動小数点にこだわるのも同じだな。abnormalだ。
まず味噌汁で顔を洗って、伊理正夫の数値計算の常識を百回読み返すまでROMってろ!
wwwまで読んだ
>>229 >お前は桁落ちも知らないで浮動小数点に粘着しているのかwwwwww
ん?この桁落ち、間違ってるのか?
君
>>228 か?何か気分害したか?直すぞ。
16桁BCDで説明し直すか?
>subnormalなnumberをいじるより、そのsubnormalなお前の知性を何とかしろ。
1e-13ってsubnormalなのか?あ、これ、倍精度な。
235 :
228 :2008/02/23(土) 01:14:16
違うわい。俺はこんな煽りはしない。 桁落ちは合ってるが、桁落ちを今知ったような、 あるいは桁落ち誤差が完全に頭から抜け落ちていたような 雰囲気に対して煽ってるんだろう。
>大体ようやくここ10年くらいでIEEE754の数値Formatは普及したが、丸めやら非正規化数の扱いなんかを >完全準拠している処理系はむしろ例外的だろ。 何いきなり抱き合わせで完全準拠を求めてんですか。 そんなに価値がないのならIEEE754rで削除してもらうか。 >SunのSPARCも対応していなくてソフトウェアで対応してたろが。 プログラマならまずシステムとして対応しているか&使い物に なるかを気にするべきでハード実装かどうかはそのあとでしょ? >浮動小数点を学び始めた人は正規数のみのイメージを作るほうが適切だ。 同意 >それに、そもそも話は正規数の範囲だったしな。 そうだっけ? >subnormal まで読んだ
非正規化数になんか恨みでもあるんだろうか。
subnormalってなんだろうと思ってたが、 サブプライムとかけてたのね。 ふーん
>>232 >幼稚園児にも分かるようにより程度を下げて
>説明してやる。感謝しろ。
ご協力感謝します。
>>194 も喜んでおります。
>浮動小数点の正規数は、おおよそ対数メッシュになっている。
>これは指数部に拠るものである。
ふむふむ、すると「対数メッシュ」の間隔は最小値近辺で大体10^-38、1付近で大体10^0ですね。
>さらにこの対数目盛りの間に細かい目盛りが等間隔で引かれている。
>これは仮数部によるものだ。
ふむふむ、すると「細かい目盛り」の間隔は最小値近辺で大体10^-45、1付近で大体10^-7ですね。
さて、
>>232 さん、ここでご指導を仰ぎたいのですが、
>>194 >0近辺では目が細かくて10^-37程度だが、
>1の近辺では目が粗くなっていて10^-7程度でメッシュが切られている。
の申す「メッシュw」とやらはどちらに分類しましょう。
「対数メッシュ」?「細かい目盛り」?
「これ以上細かい数値を足し引きしても、近場のメッシュに寄せられてしまう」
とか申しておりますので「細かい目盛り」にしましょうか。
ということで
>>194 君、「10^-37」には修正が必要だよ。
はい、本日の「小学生のイメージ」矯正終了。
循環小数に適当な基数変換を施すと有限小数になる場合があるけど、 これって常に可能なんだっけ? (任意の循環小数には有限小数に変換できるような基数が必ず存在する?) もしかして有理数 m/n として表されるなら n を基数にすればいいとかそんな感じかな? n が素数でない場合はもうちょい工夫できそうな?
悲しいことに全ての有限小数は循環小数なんだな。 89.999… == 90.0 == 90.000…
丸めると 90.0 になるから問題ない
>もしかして有理数 m/n として表されるなら n を基数にすればいいとかそんな感じかな? ・有理数 m/n は n**-1 のm倍 ・有限桁o進数は o**p の整数倍(pは有限の整数) ・mは整数かつ-1は有限の整数なので、m/n は有限桁n進数で表現可能 >n が素数でない場合はもうちょい工夫できそうな? ・(n*x == o**y)を満たす整数x,yが存在するならoは何でも良い
244 :
デフォルトの名無しさん :2008/02/24(日) 10:59:08
>>240 そこまで言ってたらわかってると思うが、m/n = 0.m (n進数)だろーがw
[m/n].(m-n[m/n]) だな。
>>244 143/7 は 0.143(7進数)ですかそうですか
>>240 n 進数で 0.a...b a...b a...b ... という循環小数があった場合、
0.a...b a...b a...b ... = a...b * 0.0...1 0...1 0...1 ... となる。
0.0...1 0...1 0...1 ... を (n-1)...(n-1) 倍すると 1 になるので、
0.a...b a...b a...b ... = a...b / (n-1)...(n-1)
だな。
逆に、整数で割りきれないと必ず循環小数になるんだよな。 余りのパターンには限りがあるから、 少なくとも 0 以外の全ての余りが出現したら あとは循環するのみだから。 そう考えると、1/素数はかならず循環小数になる以上、 素数 p は必ず何らかの (n-1)...(n-1) の約数になるのか。 なんか面白いな。
>>240 すべての循環小数は有理数
すべての有理数はp/qの整数比で表せる
すべての循環小数は基数変換で(ry
1/素数はかならず循環小数になる以上 1/2 1/5
ああ、
>>248 は基数が p の倍数じゃない時限定な。
10 進数だと 10^x は素因数が 2 と 5 しかないから、
2 と 5 以外の素数は全てそうなる。
つまり、2^32582657-1 は 9...(何か凄い桁数)...9 の約数になるはずということで。 循環の周期は p - 1 の約数のうち p の桁数以上のものになるから、 最大で 9 が 2^32582657-2 個、最小でも 9808358 個の 9 が並ぶことになるのか。 果てしないな。
ああ、2^32582657-2 が 9808358 で割り切れるかどうかは知らない。
その循環小数を乱数表にすると問題ありますか?
>>247 循環小数の有理化に関するレスだよね。
>0.0...1 0...1 0...1 ... を (n-1)...(n-1) 倍すると 1 になるので、
この時点で、0.(n-1)...が1になる説明をまた
>>247 の頭から繰り返さなければならないわけで
>>255 それは別な形で証明できるから問題ない。
さて、無理数はどうしようか。
無理数を・・・どうするの?
有理数は分数で表現できるから、無理数をあらわす方法がないか・・・ってことでは
無理数を誤差なく表現したいなら非正格関数型言語のような事をするしかないだろうな
sqrt(2) なら sqrt(2) をそういうオブジェクトとして扱うことはできると思う。 でも、こういうのでは表しづらい無理数もあるかと思う。 解析解がない(数値解しか無い)ことが証明されている 方程式の解とかは、その方程式自体を中に保持したオブジェクトを使えるかもしれないけど、 その値をさらに別の式に組み込むと・・・とか考えていくと 無理がでてきそうな気がする。
>>261 無理数の難しいところはそういう問題じゃないんだ、まずはカントールの対角線論法を理解してほしい。
ここで、自然数を列挙する縦方向と、無限小数の桁を列挙する横方向に広がった二次元の表ができ、無限小数に自然数が対応できず
自然数よりも実数の集合の方が個数が多いとなる。
問題は、これが意味するところで、Haskellなどを弄ってみると分るのだが、
この無限につづく少数の列には、後出しジャンケンのような要素を含むことが可能なのだ。
適当な実数を意味する関数 char f(int i) を考える i が桁を示し、戻り値が 0-9 までとする。
引数 i を指定すると、関数 f は常に同じ値を返すとする、この条件だけなら、この関数 f は getc を含む関数が作れることがわかると思う。
一回よんだら以後その値を使い続ければ、関数 f は常に同じ値を返すから。
そして、それは際限なく続けられる、少数は無限にあるので。
f()で無理数をダンプして途中に自分のクレジットカードの番号が出てきても、誰も責めてはいけないという話ですか。 言い訳:「どこかで誰かのgetc()がクレジットカード番号を返す可能性がある限り、私共に責任はありませんっ」 ううむ、でこれ、自然数の集合では難しい話なの?
メモ 任意の有限個の記号からなる数値定義 (√(12345/678.9)、x^123456789+...+3=0の解、etc.) は全てひっくるめても加算無限個しかない。 つまりそういう方法では決してあらわせない無理数が 無限に存在する。 任意の無理数をあらわすには常に無限桁の入れ物が必要。 (任意の自然数をあらわすのはそれに応じた十分な 長さの有限桁の入れ物でいい)
なるほど。分かりやすいわ。
>>264 無限に存在とか考えないほうがいいかもしれない、特に「存在」
これ数学上の定義で自分たちの意識している「存在」の概念とはかけ離れた所があるから。
結局のところ「カントールの対角線論法」では、とりあえず実数の利用者に実数を全部ならべさせておいて
その後から、しめしめとその利用者が列挙しなかった実数を挙げて、ほら並べられなかったダメじゃんという論理になっている。
実際に実数を実装しようと思うと同じ事が起こるというだけ、それ以上でもそれ以下でもない。
これは意識したすべての実数については、表現可能だが利用者が意識していない実数についてまでは実装できないという事。
たとえば、純粋抽象クラスを実装する場合、その中身がかかれてなくてもそれを利用するコードは書ける。
しかし実際には純粋抽象の中身を書いたクラスを使わないと利用できない、具体的なコードは「後からでも書けるよ」というのと似ている。
書いていて思ったんだが意識ってなんじゃろね、不思議じゃ
「考慮」 と言った方がいいんじゃないかな。
任意の実数は不可算無限個あり、バイト列の個数は自然数なので高々可算無限個どまりだから、無限に伸びるバイト列が利用できても任意の実数を表現することは無理
>>269 任意の実数と言わずとも任意の有理数が表現できたらうれしいですけど。
「無限に伸びるバイト列」かあ。
多倍長計算のライブラリとかで、循環小数をきれいに扱えたららいいなあと
思うんだけど、どうなんでしたっけ。
>>270 数式演算すればいいんじゃね?
Mathematicaと言わず、HP49Gくらいでいいじゃん。
>269 言い換えてみる。 最初から無限長のバイト列(0で初期化済)があったとしても サイコロを振るなりしてその中を埋める作業が永遠に終わらない ので結局実数を表現することは無理。 とはいえ中を埋め続けるアルゴリズム(時間がたつほど精度が 上がる)があるような実数ならその実数はきちんと定義されたと いえる。でそのような実数は可算無限個しかない。 >270 循環小数だとわかってるならそこまで格納できればいい。 1/3 = 1/(2^2-1) = 0.010101...(2) 1/7 = 1/(2^3-1) = 0.001001...(2) 1/3*1/7 = 1/21 = 3/1/(2^6-1) = 0.000011000011...(2) 周期aの数と周期bの数を掛けたら結果の周期はa*bかその約数 結果の周期の分だけ循環部分を展開して掛ければ 正しい結果を取り出せるのかな? (結局は分数で扱うのが一番簡単そうに見えるのが) >272 うーんなんだこりゃ
よく考えたら間違ってる 1/3*1/3 = 1/9 = 7/(2^6-1) = 0.000111000111...(2)
不可算無限を実現する必要は無いと思う。 実際の問題で扱う値ってある程度限定されてるから、 その実際に扱う値さえ表現できればそれで現実的には十分だと思う。 ただ、それでも無理な事もあるかもしれないけどね。
>>273 >周期aの数と周期bの数を掛けたら結果の周期はa*bかその約数
なるほどそんな性質が。
>(結局は分数で扱うのが一番簡単そうに見えるのが)
例えば小数を分数に変換する、みたいなプログラムがたまにありますけど
有限な小数しか入力できないというのは片手落ちかなと思って。
周期が短い循環小数ぐらいはなんとかしたいかなーと。
例えば 1/7 の循環小数を入力したら、ちゃんと 1/7 を答えてくる、みたいな。
>例えば 1/7 の循環小数を入力したら、ちゃんと 1/7 を答えてくる、みたいな。 循環小数を入力する書式さえ決めれば、どうにでもなるかと 循環部分を括弧で囲む 0.[142857] とか、循環する桁数を付ける 0.142857, 6 とか 142857/999999 で約分して 1/7
>273 どこの分野でも測定機の精度が八桁もあったら高性能といわれる 実数をきちんと表現しても元データの誤差以上にはならないから 現実的には計算が遅くなるだけでなんの意味もなさないでしょ 役に立たたないことそんなに力説しないでもいいんじゃない >276 循環小数なら整数演算だからスレ違いでしょ
KY
不可算無限個について、なにやら認識が膨らみすぎてどうにかなっている人がいるので、ちょっと書いとくよ。 可算な集合の特性は適当な集合について、これをコンピュータで言う所の class でいうと それは隣の要素を知るためのインターフェイスがあるという事だよ。 適当なコンテナオブジェクトがあるとき、その内容を列挙する気がないのなら別に列挙インターフェイスをつけなくてもいいんだよ。 それが不可算無限個を扱うという事、作れないって事はない、それは機能が制限されたライブラリとなっているだけだから。
>>277 なるほど。
ちなみに 142857/999999 というのは等比級数の無限和ですかね?
>>281 x = 0.[142857]
1000000x = [142857] = 142857.[142857]
1000000x - x = 142857
x = 142857/999999
>>282 なるほど。等比級数を持ち出すまでもないですね。ってゆうか確か高校で等比級数の和を
教えるときは同じような変形をするんだったかな。
浮動小数点の数値を整数分数に直してその後は分数として計算したら、精度的には
うれしい場合もあるかな?
>循環小数を入力する書式さえ決めれば、どうにでもなるかと >循環部分を括弧で囲む 0.[142857] とか、循環する桁数を付ける 0.142857, 6 とか 914314.3143...とかどうしよう。9[143]XX.0とかでいいか。 無理数か循環小数かよく解らない数はどう表そう。 オイラーの定数γとか。
>>278 ビット表現に×2^nと正規化が出てきたら文字通り
浮動小数点だと言ってみるテスト
(まあ現在普通に浮動小数点といえば
誤差含む数を扱うためのものだが)
>>280 実際のところ実数が不可算無限個あるって性質は
無視していいよね。
数学上は可算無限個の中に含まれない実数を
作り出すこと自体無理だし、
実用上は誤差を考えれば有限桁ですむし。
>>284 表そうも何もどういう循環小数か分からない時点で
>>286 有限のメモリーの中に無限を置けないのは、可算・非可算問わず事情は同じで
有限のメモリーの中"無限"という文字列が取り扱えるという事情も可算・非可算問わず事情は同じかと。
まあ、この話が出てきたのはBCDなら万全とかいう変な人のレスからだし、 真剣に無限どうこう考えてるわけじゃないでしょ。
289 :
デフォルトの名無しさん :2008/02/27(水) 20:29:04
非加算な世界を考えれば、もうなんでもありですからね。 アルフ0 の一つ上は実数でしたっけ(連続体仮説?)
>現在の数学で用いられる標準的な枠組みのもとでは >「連続体仮説は証明も反証もできない命題である」ということが明確に証明されている。
>>240 >(任意の循環小数には有限小数に変換できるような基数が必ず存在する?)
>もしかして有理数 m/n として表されるなら n を基数にすればいいとかそんな感じかな?
>n が素数でない場合はもうちょい工夫できそうな?
>>243 >・(n*x == o**y)を満たす整数x,yが存在するならoは何でも良い
nからよりコンパクトなoを求めるアルゴリズムが思い浮かばないよぅ。
素直にnを素因数分解するほうが近道か・・・
素因数分解はコストが大きいですよ
294 :
デフォルトの名無しさん :2008/04/25(金) 22:58:05
1.4142135623730950488016887242096980785696718753769
確かカイジでは
イヨイヨ ミゴロシ って読んでた気がする。
1414 3564
>>294 CPUは、繰り上がりフラグがあるから、足し算なら無限にできる。
掛け算を因数分解して有効桁の範囲で計算したあと足し合わせればいいわけで。
または文字で計算。まあ速度的にないと思う。
宇海零が開平法知らなくてフイタw
ひとよひとよにひとみごろ 1. 4 1 4 2 1 3 5 6 が一般的だろうな。
298 :
デフォルトの名無しさん :2008/09/25(木) 14:29:48
299
300
301 :
デフォルトの名無しさん :2009/02/15(日) 22:19:06
FPU命令に三角関数があるらしいけどマジで? ところで、Boostの分数はいずれ多倍長整数をサポートするとか。 精度ってどうなのよ?
>>302 ほへぇ〜。だったらsinテーブル作って引くよりそっち使った方が早いのかな?
>>303 んなわけないだろ
8087系統は愚直にマクローリン展開の公式を実行している
だけだからクロック数はすごいぞ
そっか。でもまぁ、SSEなんざ使うよりまし?
>>303 そういうことを自分で調べずに、このスレで何をするつもりなの?
>>304 乗算器が速くなかった時代では級数展開やってない。
CORDICでぐぐれ。
>>306 実装って複数あるだろうから平均的な動作を知りたくてね。
やろうと思えば、アセンブリ命令レベルで組み込まれてる訳だから
並列化した回路を実装してある物もあるかもしれないじゃん。
でも、そういう情報は古すぎてかあんまりWebにゃ載ってなくてねぇ。
>>307 ほう昔はこんな方法使ってたのか
今じゃRadix16だからなー
逆数テーブル持ってるんじゃなかったのか。
doubleの逆平方根が存在しないのは何故? floatからニュートン法でやるしかない?
そうか、SSEスレじゃないのかスマン HPのWS?の関数じゃあなあ
そりゃぁ、このスレはx86での浮動小数点数のスレなんだから、HP-UXだってありだろ。
315 :
デフォルトの名無しさん :2009/02/19(木) 19:55:09
素朴な疑問。SSE用レジスタっていっぱいあるけど、 なんちゃらオーダー見たいな機能で並列実行とかされないの? 暇そうに遊んでるレジスタが気になって仕方ない。
OOOのことか? >>SSE用レジスタっていっぱい だからOOOが効くとでも思ってるのか?
やっぱりねぇ。 結局多項式でぐらいしか意味は無いのか。 もったいねぇ。
>>317 おまえ、全然分かってないな
多項式だって a(b+x(c+x(d+x)))をSSEに置き換えただけでは
全然効果ない
>>318 そうなんけ?2〜3倍早くなったことはあったけど。
じゃああのレジスタ群は何に使うのよ?
そこがテクニックw
>>318 単に置き換えただけでも効果あるぞ。
FPUはfxchとか駆使してもOoOし切れないことが多い。
SSEの一番の問題は、超越関数を使うにはFPUに切り替えるかiccの内部関数に頼るか自作する必要があることだな。
iccではsseで改めてcos/sinとかを(ソフト上で)実装してるってこと? icc持ってないから分からないんだけど。
あるっぽいよ。iccが出力した実行モジュールのプロファイルを見た限りでは。
sse精度になっちゃうんじゃないの? それとも-msse, -O3とは別の意味で、オプションとか組み込みキーワードで精度を選択できるのか?
10バイト精度でがんばっていた人たちって、どうするのかね。
fp80のことか?もう見捨てられてるっしょ。 ただでさえサポートしてるプロセッサはx86以外ほぼ皆無だし。 実際問題精度よりスループットのほうが重視されてるからな。 スループットがあればFFTによる多倍長演算も容易になる。
むぅ、128bitはドリフトか。
80bit精度って今となっては帯に短し襷に長しだからな。 MSコンパイラがlong double = doubleにやっちゃってるし。
80ビットはインテルの(変態)独自仕様だと思ってたけどちがうの? 出来るだけ64ビットに演算誤差を伝播しないようにするインテルの親心というか・・・
ところで、FFTの多倍長というのは桁数いくつ以上からを考えてるの? 128ビットじゃないけど、金融・財務とか科学の計算でも普通は多く50桁*2程度あれば十分だと思うけど。 暗号とかエンコード用途なら、スループット以前の問題でFFTをハードとしちゃうだろうし。 というか、IEEEは早いところ16ビット小数を定義して実装して欲しい・・
もうAMDのでいいよ
つか、金融・財務で10分の1が正確に表せない浮動小数は非常識かと。 COBOLみたいな10進で扱う言語がわざわざ使われてるわけで。 かつ、Javaへの置き換えとかはBCD専用クラスとか作ってやってるわけで それにしてもAMD64がBCD演算命令を整理(廃止)する一方で今更POWERが実装とかアフォかとヴァカかと どうせ高級言語ごしでやるんだから命令ニーモニックレベルでのサポートも原則的には要らない訳なんだが。
桁数の実用性の問題だから、当然BCDとか小数とかの比較のことじゃなかったんだけど。 BCDとかの実装の問題だとしても、ソフト上でintでいいんじゃないの? 例えば、高々100桁程度でかつ100桁の固定精度で十分なのに、どこにFFT使うんだ? 廃止かどうかというのは、当時の貧弱なハードや産業界の需要によって機能をつけたわけで・・・ 浮動小数は、実際は指数部分が重要なわけであって、仮数部分は低精度でいいってことは分かってるのか?w 仮数の精度は低いが、たとえ8ビットだとしても高精度と比較してもグラフの形状はほぼ同じ形状になる。 高精度が欲しいなら小数なんか使わないでBCDにすればいいんじゃないの?
>>322 SSEというのはスカラー演算はおまけで、ストリーム用途(といってもたった16バイトだけど)が本命じゃなかったのか?
インテルはサーバ用CPUの方に目がいっちゃってるから、PC用ではAMDの方がやる気あるよねって言うのは同意するけど。
でもインテルは組み込みやサーバーや携帯市場にもいってみたけど活路は無く、一方でPC市場を放棄したりして一体何やりたいんだろうね。
一番活躍できそうなネットブックは、MSが仕様作ってるからインテルが主導権握ってる市場じゃないみたいだし、インテルには将来の展望というか何やりたいのかさっぱり見えてこない。
小数とは関係ないけど。
少し話がずれていくが、「仮数部分は低精度でいい」ってのは語弊があるな 高い精度で高速な浮動小数点演算を必要とする需要ってのもいくらでも存在するぞ 最終段の出力が全てではないわけで ま、そのために80ビットてのも痛し痒しだって流れには同意するけどね
>>336 それも一応考えてみたんだけど、浮動小数を他と比べるとき、仮数(有効精度)で比べると10進上の扱いや演算誤差はBigDecimalの方が分があるから浮動小数は入らないとなるけど、
指数では当然だけど浮動少数の方にメリットがあって、少ないビットで巨大な数2.1 * 2^1022 などを表現できることに利点がある。
これはBCDでは桁数分の配列(上と同じなら1000以上)を用意しないとだめだし、もしBigDecimalだとしても実装が val * 10^exp とするならそれは浮動少数でしかない。
つまり浮動小数は、極端に言えば仮数は指数がゼロか否かの1 0のみでよくて仮数に意味はなく指数が命ってことになる。
すると8ビットでもいいじゃないのって事がわかってくる。深く考えてみれば分かるよ。
それなのに仮数の精度がどうとかこうとか言うのは、よくいるだろ?財務アプリなのにint,longで金額を保持しちゃう奴。アレと同じだろ。
もし精度が欲しかったり演算誤差を気にするなら、プリミティブ型なんか使わずちゃんとBCDつかったりソフト上で多倍長を実装するべきだと思うよ。
sigma取る時に桁落ちしなければ何でもいい
じゃ80ビットでいいじゃん。64ビットまでを有効桁にするだけ。 関数電卓(手元にあるのはカシオだけど)の説明書では10桁を有効桁にして、内部では15桁でやってるとかいてある。 たぶん実際のこと知らないのに、どっかの三流起者とか○○研究所研究員が書いた記事を鵜呑みにしちゃって、演算誤差が出やすいとか思い込みしてたんじゃないの?w
>>339 10^15程度でいいなら倍精度の53ビットあれば十分だろ。
更に言うなら64ビット整数と10^nの固定スケールで表してもいい。
なおさら機種依存のfp80なんて使う必要ねーよ。
むしろ【浮動】小数で扱う必要がない。
ジンバブエドルでも扱うのか?www
15桁っていうのは、内部的に倍精度ってだけなんだろ ところで財務アプリなんか触ったことないがなぜlongで保持しちゃいけないんだ? _int64で持てってこと?
342 :
デフォルトの名無しさん :2009/02/21(土) 12:59:31
言いたいことが良く分からないんだけど、例えばジンバブエドル100兆ドル札が発行されたとしても、使う人たちはりんご20個で100兆130ドルか100兆140ドルかの違いなど気にすることはない。 君の妄想はこの程度しかできないんだろうけど、もっと現実に即して考えないと後々損することになるかもしれないよ。 80ビット精度は上にもあるように64ビット(IEEE定義のdouble)に演算誤差を伝播しないためにインテルが保障を確保するために必要とする精度であって、ジンバブエドルとはまったく別の話。 英語のウェキの方が詳しいが、IEEEの浮動小数点数の定義も含めて勉強しなおしたほうがいいんじゃないか?
>>341 longで持ってもいいけど、プリミティブかオブジェクト(インスタンス)かの違い。
インスタンスで持つとオブジェクト指向の方法論が使えて何かと便利ってこと(他にもあるけど)。
>>343 いや、普通に long じゃ桁あふれするだろ。
この前ジンバブエドルがデノミを行ったのは、コンピュータで扱いきれなくなる恐れがあったかららしい。
>>342 金融演算知らないシッタカは黙ってな。IEEE浮動小数なんて使わねーよ。
整数四則演算より80ビット浮動小数の方が速いような変態CPUなんてどこにあるんだと。
fp80をかろうじて使える当のIntelすら整数(固定小数)のほうが圧倒的に速い。
100兆130ドルか100兆140ドルかが大きな意味を持つ世界もあるわけで。 結局適材適所だよね。
348 :
デフォルトの名無しさん :2009/02/21(土) 15:17:40
知ったかといって大きく出た割にはビッグマウスだなw 金融とか財務とかのアプリで、どこに浮動小数を使う場面があるんだ? 整数と浮動小数(IEEE)で全然違うフォーマットなのに比べてみたり、一体いつの時代で比較してみたり速いとか遅いと基準もなく比べたりしてるんだ? どうせ「IBM」という肩書きの3流記事を読んで頭おかしくなっちゃってるんだろ。知ったかはお前の方だな。カスは黙ってろw
Wiki=ウ【ェ】キは新しすぎる
350 :
デフォルトの名無しさん :2009/02/21(土) 15:23:05
新ジャンル「ウェキ」
>>346 あのね、ベンチマークなんかいくらでも都合よくプログラム書ける訳よ。
インテルがtmpegエンコ―ダに賄賂(支援)してインテルCPUに都合よくプログラムしてるって話は有名だろw
例えば統計の数値使って官僚とか経営者を騙すとかたまに聞くだろ。つまり、IBMとか東大とか肩がきってのはそういうの同じ(その統計もある意味あってるから別に否定はしないけど)
頭弱いおサルちゃんはどの分野にいっても「コロっと」騙されちゃうんだろうけど(笑)
TMPEGはCUDAにすら対応してるわけだが 賄賂?妄想を既成事実にしないで下さい
最新のIntelCPUでFP80がクソ遅いのは常識なわけだが。 物理的に32bit×4ないし64bit×2のSIMDに最適化された演算器しか載ってないし。 なにより今時スタックな時点で論外。 他人のベンチがどうとか以前に自分で計測してみろよ、ゆとり
>金融とか財務とかのアプリで、どこに浮動小数を使う場面があるんだ? PBRとかわざわざ固定小数で計算してるとは思えないな。
SIMDでBCDを使うと10のべき乗単位の乗除をバイトシフトで表せるという利点がある。
BCDクラス内でSIMD用のビットアラインメントって出来るの?
どんなに精度が高い演算ができようとも、手計算で小数点以下2桁で切り捨てた低精度演算の結果に合わせなけばならない悲劇
>>353 物理的にはFPUユニットとSSEユニットが載っているわけで、間違って覚えたりしてないでインテルのマニュアルをあとでこっそり読み直したほうがいいんじゃね?
鼻高々に知ったかばかりしてると、もっと大きな恥かくことになるからw
使わないなら、銀行型四捨五入とかやめてほしかった。
>>359 銀行で使ってるの見たことないんだけど
使ってる銀行ってあるの?
>>360 つ Banker's Rounding
ジンバブエで使ってるCPU使えばよい
>>353 >>358 ia32_final_i.pdf
今時のCPUは十分に処理能力が高いから、遅くても問題ない。
365 :
デフォルトの名無しさん :2009/02/21(土) 23:45:37
>>364 いや、シミュレーションの世界では早ければ早いほどよい。
>>358 「論理的」だろ。物理的に別ユニットっていつの時代のCPUだよ。
現行のCore MAなんかではx87とSSEは共用だよ。
大別してFADDがSIMD FP Adder, FMULがSIMD FP Multipler。
あとDividerとかFP ROMが同じポートにぶら下がってるかな
まあ、fpスタック経由でしか80bit精度の演算ができない(XMMレジスタは使用できない)時点で
実効スループットは察して下さい。
>>364 英語版にしろよ。それPentium 4までしか載ってなくね?
>>366 結局お前か。お前のウンチクなど聞きたいわけではないわ。
名無しで潜伏してないでちゃんと名を名乗れ。ニートwww
>>367 スループット云々よりもメイン・メモリとのレイテンしが改善されないから、もう頭打ちなんじゃないの?
結局fetchに頼るのみなら、80ビットやFPのフォーマットや機構(スタックとか)の問題じゃないし。
SSEは、レイテンシを考えると、ガバッと持ってくるようにするために16バイトとかケチってないで32バイト(double*4)でよかったんじゃないかと思う。
>>368 は?ww
被害妄想いいかげんにして。
ウェキは吹いたwww
>>369 >SSEは、レイテンシを考えると、ガバッと持ってくるようにするために16バイトとかケチってないで32バイト(double*4)でよかったんじゃないかと思う。
それがAVXなんだけど・・・。
>>346 > 整数四則演算より80ビット浮動小数の方が速いような変態CPUなんてどこにあるんだと。
Netburstだと、整数の乗除算よりFPの乗除算の方が速い
prefetch*はキャッシュライン単位だぞ。
あと、Core MAやAMD K8以降ではL1キャッシュの1ラインは64byteなんで。
シーケンシャルリードなら同一ラインの後続ブロックもL1から続けて読めるから
>>369 の想定する用途では全然問題ないと思うんだが。
シーケンシャルとか定ストライドなどのパターン性のあるアクセスなんかだと
いまのCPUではキャッシュ自体が自動的に先読みしてレイテンシ隠蔽してくれる機会がある。
ベクトル長伸ばしちゃうとそれはそれで厄介だぜ
座標を表すのですら、単精度だとx, y, zであと1要素分余らせたりすることが珍しくない。
現状のSSEの実装ではpermute演算はそこまで強力じゃないので128bitが妥協点だったのでは?
>>367 thx
>>369 >メイン・メモリとのレイテンし
そこは、cacheが入り込むし、命令の並び換えで適当に隠せる。
>>373 >現状のSSEの実装ではpermute演算はそこまで強力じゃないので128bitが妥協点だったのでは?
だからさ、その時代その時代に合わせたお前のウンチクなんて興味ないのよ。
3年後には全く逆のこといったりするだろ。
主張がコロコロ変わるからいつまでたってもお前は誰からも認められないんじゃないの?ニート君w
>>373 なんつーか、お前の浮動小数点の理念とか信念なんか聞きたいわけじゃないわけ。
fp80の精度が必要な人もいれば、高速な方がいいって人もいるわけで、インテルの洗脳されちゃってるお前の信念を押し付けないでくれないか?
それも信念がコロコロ変わるんだろ。お前だって嫌だろ。草かみたい選挙が近くなるたびに草か信者が家に押しよせてきたら・・・
prefetchはINTELとAMDで細かいところに互換性がないから、(未知のバグになるから)できればユーザーが明示的にコード書いて使うようなものではない、ってことだったんじゃないの?
> 3年後には全く逆のこといったりするだろ。 言わねーよ池沼 10年前のPentium IIIではSIMD演算ユニットは単精度2並列分のスループットしか得られなかったが それでも10年前なりの技術水準でできるだけのことはやってた。 それを文句言う奴はいねーよ。
x64でのx87のレガシー化で主に動いたのはMSとAMDなんだが。 IntelはAMD64のコピー実装だし。 Intel信仰がどうとか言ってることがちゃんちゃらおかしい。 ウェキ(笑)
380 :
デフォルトの名無しさん :2009/02/22(日) 02:21:28
>>372 よく分からないんだけど、bitwiseの観点からみれば整数四則もFP四則も同等でしょ。
両者に差が出るようところはどこにあるの?
整数もFPも、10進に直したり結果を出力して視覚化するところに差があるというなら、本質的には君
>>346 が言うところの四則の計算とは関係ないわけで・・・
>>377 キャッシュのローカリティヒントなんて同じIntelでも、Pentium 4とCore MAでも動作が違う。
たとえばPen4ではprefetcht0を使ってもL1にはデータは置かれないがCore MAでは置かれる
だがキャッシュのヒット率なんて演算結果に直接影響しないだろ?
キャッシュローカリティで演算結果が変わるようなプログラム書いちゃう人はそれはそれで問題だが?
昔のIntel独自実装の8087をマンセーしつつIntel信仰はキモイとかどんだけ〜 単精度と倍精度はIEEE754の規格にも入っててPowerPCやARMでも使えるんですが。 FP80(笑)
>>378 ,379
当時の水準でFPUとSSEは分離してたのが最良といいつつ、何でさっきの主張では「FPUはイラン!」とか文句言っちゃうんだ。
どうも当時の技術水準とその互換性「FP80」に文句あるみたいだけど、そんなに演算誤差を気にしなくてもいいプログラムをしてるのか?
お前みたいな奴が「古い技術はイラン!」とか言って互換性を破壊していく元凶なんだよな・・・・そういうの世の中に出てみると分かるけど、即効で嫌われるから。
日本男児の固定観念もいいけど、英語の発音では一応「ウェキ」といってるようだが・・・なんかお気に入りのようだなw
なんで団子の周りには馬鹿が集まるんだ?
385 :
デフォルトの名無しさん :2009/02/22(日) 02:36:00
>>379 インテル信仰とは、インテルのx86命令コード体系のことだと思うんだが・・・?
実際今の64ビット向けとかはAMD64の定義をコピーしてインテルが使ってるんだし。
もしかして団子は、会社としてのインテル(INTEL入ってる!)にあこがれてるのか?
よく読んでみると所々に穴があるよね。団子はw
おまえ馬鹿だねぇ Pentium IIIのSSEはたかだか単精度のSIMDでしかない。 SSE2以降は倍精度も扱えるようになったんで共用化したほうがよくなったんだろ。 倍精度対応の演算ユニットは半導体のコストが大きいからね。 PowerPCのAltiVec(VMX)でも倍精度対応のスカラFPUと、単精度までのVFPUが共存してるが POWER7のVSXでようやくレジスタセットごと統合の運びになりましたが。
>>384 俺に噛みつく奴は馬鹿ってより
馬鹿だからこそ噛みつくんですよ。
というか業界人でもない普通の人(本業でPG含む)は、新作CPUの各ベンチ取るために毎度毎度CPUを買ったりしないから。 だからPen4では・・とかCoreでは・・とか言われても知らんわ。現状では、一般的に議論ができるのはSSE1/SSE2しかないな。 実際PC使いこなしてアプリ作ってるわけでもないくせに、お前の主張など、「ソニーのパソコンは・・・東芝のパソコンは・・・」とか言ってるカスタマーの戯言にしか聞こえんわw
過渡期の実装は一見無駄に見える。近視眼の馬鹿には。
>>388 それで、x87とSSEが分かれてないPentium IIIのパソコンをいまだに使ってるんですね。
零細企業乙
391 :
デフォルトの名無しさん :2009/02/22(日) 02:51:29
というか、団子はブログとかウェキでもやりながら、細々と「執筆募集!」をすればいいだろ。 隅々までマニュアル読んでるようだし、どこかの雑誌とかベンチャーが「ベンチとってくれない?」とかの依頼ぐらいはあるだろから。 少なくともお前の能書きを2chスレに書かなくていいからw
ウェキ(笑)
え!団子さんってブログもってなかったの?! ダサw
[wi]の発音は日本古来の「ヰ(ウィ)」に相当するものであってヱ(ウェ)じゃないんだよね
もしかして: ウィキ ウェキ(笑)
真夜中ですが基地外警報
そんなに発狂するなよ。その情熱をブログにぶつけろwたまに読んでやるからw 一応言っておくと発音のときはスラッシュを使う。 で、wikiの/i/は/e/ではないので口が横に大げさに伸びるわけで、日本人の耳では「い」や「いぇ」ではなく「え」に聞こえるはず。 また、まえの/w/と重なって「い」のようにはっきり聞こえる事はない。 短母音にこだわっちゃう辺りも、団子は生粋の日本男児なのかねぇ。どこ出身?
>>399 こういうどうでもいいところに情熱を注ぐ意味が分からん。
ところで団子のINTELウンチクはもういいから、このスレでは小数の話題にしてくれないか?
404 :
デフォルトの名無しさん :2009/02/22(日) 03:34:27
>>401 層化かと思ったけど、ああ在日なのね。
別に層化も在日は嫌いじゃないんだけど、それならファビョーリやすいのも納得だわw
吠えてますなwww 悪いがミンジョクではない。俺はシオレスト(笑)だぞ。
ウェキ君はみっともないな
雑談はよそでやれや
>>403 そういうウンチもいらないからw
ウンチするなら他でやってくんない?
ウェキ(笑)がどれだけ恥ずかしいかは知っておかないとね
「ムー大陸の末裔」の方が数倍恥ずかしいと思うが…
そりゃ金融システムでFP80だとか非常識きわまりないことも言えるわけだ。
JavaやC#でPL/IやCOBOL同様に10進演算をサポートしてる理由を考えてみてくれ。
ちなみに754rのドラフトにも10進演算の項目入ってるよ。確認しる。
http://754r.ucbtest.org/ FP80(笑) ウェキ(笑)
>>410 ムー大陸は太平洋の島々の言語の構造や発音の共通性から言語学者が唱えた仮説だよ。
少なくとも母音の発音は同じアルタイ語族の日本と同じだってこと。
陸地がないと人間は大規模な移動ができないと思い込んでいる大陸系らしい考え方
414 :
デフォルトの名無しさん :2009/02/22(日) 05:18:46
「実は日本人はムー大陸の末裔だった!」という衝撃の真実を聞いて駆けつけてきました
ムー大陸は民族とかの人間に関するカテゴリーに属してないからそれは間違っていないか?
>>377 3DNow!のではなく、SSEのprefetchを使えば良い。
>>386 >SSE2以降は倍精度も扱えるようになったんで共用化したほうがよくなったんだろ。
共用を前提として、SSE2を作ったという考えをしてみる。
『共用化』っていうのは、『復号化』のように、頭が悪く見えるね:b
>>413 海洋民族の航海技術を無視した白人優位思想が根底にあるね。
白人ブルーブラッドが黄色人種を支配してたなんて電波な説だし。
自分たちの古代文明が見つかってないのでどこかにあったと思い込みたい白人に熱狂的に支持された。
※もちろんブルーブラッドなんて比喩であって、実際に人の血を青くしてみた創作は○ーゼ○ォンくらいのものです。
アメリカとオーストラリアに大量移民した奴らがよく言うよ
421 :
デフォルトの名無しさん :2009/02/22(日) 13:38:47
>>419 秋葉原のショップでは、こなた(らき☆すた)のフィギアは売ってますか?
古い話を掘り返してみると、>359の書く「銀行型」って、ISO丸めのことなのね。 >362にあるように元は英語だろうけど、それを直訳した馬鹿がいるから >361のような「銀行で使う」と思い込む間抜けが出てくるんじゃないか。 寧ろ鉱工業などで測定結果の集計するのによく使うのに。
パイルバンカーの方?
銀行は銀行だけど、「銀行家の」と言う意味だね。 まぁ、銀行でも使うケースと使わないケースがあるのだろうし、 「銀行型」って言い方をするよりも「ISO丸め」って言い方でいいんでない? まぁ、>422は言い過ぎだね。
8087作ったときは、ISOじゃなかったのでは。
んじゃ、8087について語りたいときはansi丸めでw
団子ってmixiにアカウントは持ってたよな。 嫌いなサイトが2chだとか書いてたろ。
それどころかVIPのコテとばっかしつるんでたが
430 :
デフォルトの名無しさん :2010/01/30(土) 07:55:53
貧乳について教えてください
「インテル 64 アーキテクチャーおよびIA-32 アーキテクチャー最適化リファレンス・マニュアル」を読んでいて驚いたのだけど、 最近のCPUは除算のレイテンシとスループットが異様に小さいんだね。 FDIVでレイテンシとスループットが6と5って乗算とそんなに差がなくなっているね。 あとx87の表にNehalemがないのはNehalemってx87を積んでないの?
トランジスタの物量攻勢で、年々巨大なテーブルを引いて割り算するようになってんじゃないかな? バグ付きPentiumで有名になったアレ。まだまだ早くなるのかも。解説お願い。 float同士の割り算の全パターンを事前にテーブル化して焼いとくのもそう遠くない未来のような。 (仮数部だけでいいとして46bitのインデックスを引っ張るテーブルがあればいいのか?
少なくとも一回計算した組み合わせくらいはキャッシュで持ってても良いよね
SSEを使うっているのは一般に、SSE命令を使っていればいいのか? 最近のコンパイラが吐くコードってスカラーでもaddssとかsubssを使っていることが多いので、 それだと何もしなくても”SSE”を使ったコードになってしまう気がする。 それともSIMDを使わないのはSSEを使っているとは言えないとなるのだろうか?
単に8087由来FPUの80bitレジスタが嫌なだけじゃね? とエスパー回答してみる。
x86-64向けでなく組み込み関数でもなく、オプションも付けずにSSE命令を使うのはICCだけだろ
gccでも使うよ。適切にビルドされていれば
gccでも使うんだよ。でもさすがにパックドのコードを吐くことはないけど。
439 :
デフォルトの名無しさん :2010/03/20(土) 17:58:41
インテルコンパイラを使っているのですが、WindowsとLinuxで結果が変わってきてしまいます。 精度を同じにするには、どのオプションを使えばよいのでしょうか?
>>439 http://homepage1.nifty.com/herumi/prog/prog90.html#PRECISION
新しいOpteron(Magny-Cours)で単精度のSSEのコードを走らせたんだけど、異様に遅い。 スカラーのコードの方が遙かに速いんだけど、そんなことってあるのかな? インテルのCPUなら概ね2倍になるコードなんだけど、2倍どころか1/3にもなりそうな感じだった。 ただ、倍精度になるとスカラーよりも速くなる。 ICCでやったりgccでいろんなオプション試したけど、あんまりかわらないので何が原因かわからずにいる。 これだけで原因がわかるエスパーな人がいると助かるんだが。
ttp://pc.watch.impress.co.jp/docs/news/20100329_357660.html >4つ目は省電力機能の拡張だ。Opteron 6100にはIstanbul世代で実装されていなかったC1E(CPUがスリープモードにあるときの電
>力を減らす機能)が実装されたほか、「AMD Cool Speed Technology」と呼ばれる省電力機能が実装されており、温度センサーで温
>度が限界を迎えたと判断したとき、プロセッサのPステートをより低い段階へと強制的に移行させる機能だ。これらの機能により、プロセ
>ッサの電力効率を前世代に比べて高めている。
CPU温度が高くてクロックダウンしてるとか?
分からんけどw
>>443 ベクトル化が下手かOpteronの単精度がうんこかOpteronが不得意な命令を使っているか、
だと思う。
ICCはインテルCPU用の最適化しかしないという噂だけど、
gccはそんなことないはずだし。
プログラムの一部でもさらす気があるなら
もうちょっと答えられるかも。
C++とIntrinsicライブラリ?
C++とインラインアセンブラ?
C++とアセンブラ?
32bit? 64bit?
>>443 スカラーのコード
x87 or SSEのスカラー命令を使うコード?
SSEのコード
コンパイラの設定でSSEを使うようにしたスカラーコード or 並列化したコード?
>>444 これさ、一度CPUクーラーのファンを止めて、高負荷で動かしてみたことがあるんだけど、
マザーから警告のアラームがなって、ヒートシンクをさわったらさわれなくなる位めちゃくちゃ熱くなっていたけど、
実行しているプログラムが落ちることなく、動き続けていたから、相当熱くなるような環境でないと、
クロックが落ちることは無いと思う。よく負荷テストとかでPrime95とかいうFFTを馬鹿みたいに立ち上げる様な
ことをしない限りは無いんじゃないかな。
>>445 レスサンクス。
使っているのはC++とIntrinsic。最初はインラインアセンブリで書いていたんだけど、
WindowsのVCCも考えて、Intrinsicに変更した。
コードをさらしたいのだけど、さすがにそれは出来ないので、
ちょっとシンプルなコードを書いて比較してみるよ。
何かわかったら書き込んでみる。
なんとなく思っているのは単精度だとシャッフルやらシフトを多用しているんだけど、
倍精度ではデータ幅の関係でそんなにやらなくていいので、Opteronはシャッフルとかシフトに弱いのかなあ?
とか思っている。
>>446 64bitで使っているんで、もはやコンパイラがx87のコードを吐いてくれません。
ちょっと表現が悪かったけど、SSEと言っているのはベクトル化したSIMDコードという意味。
>>448 シャッフルのレイテンシ
AMD Family 10h: 3 cycle
Intel Penryn以降: 1 cycle
「OpteronとIntel(Core2?)とで挙動が違う」のが問題であるなら、 キャッシュ構成を疑ってみるのはいかが。 Opteronの一次キャッシュって今も2-wayなの?
451 :
443 :2010/06/29(火) 01:29:17
ちょこっと調べてみたら、クリティカルな部分は
ループの中に
for(;;)
{
//A,B,Cその他諸々のデータを取ってきて下記を実施
SSEの計算群1 -> 結果をxmm0に最終的に放り込む
SSEの計算群2 -> 結果をxmm5に最終的に放り込む
SSEの計算群3 -> 結果をxmm10に最終的に放り込む
// メモリへの書き込み
A[i] = xmm0;
B[i] = xmm5;
C[i] = xmm10;
}
と言うような感じなんだけど、メモリへの書き込みの段階で偉く遅くなっていた。
>>450 が言うようにキャッシュの問題なんだろうけど、解決方法は無いのかな?
Opteronはライトスルーなのかな?
A、B、Cの結果は再利用されることはないので_mm_stream_ps()でやってみたけど、そっちはもっと遅くなった。
配列A,B,Cのサイズを 32kBの倍数+64*n(n=1,2,...,511) に変える
>>451 A,B,Cのサイズは?
SSEの計算群1 -> 結果をxmm0に最終的に放り込む
A[i] = xmm0;
SSEの計算群2 -> 結果をxmm5に最終的に放り込む
B[i] = xmm5;
SSEの計算群3 -> 結果をxmm10に最終的に放り込む
C[i] = xmm10;
とやってみるとか。
Cだけ_mm_stream_psにしてみるとか。
キャッシュスラッシングが原因だとすると スカラーコードではA,B,Cは独立した ループで処理してるのかな?
455 :
443 :2010/06/30(水) 02:18:30
>>453 レスありがとう。
実はすでにやってみたけど変わらなかった。
ひょっとしてレジスタが足りなくなって、xmm0とかが、メモリに待避させられているのでは?
と思ったんだけど。
A,B,Cのサイズ自体多次元配列で、すごく大きいけど、ループの中では4K以下になるように処理している。
たとえば
AAA[i][j][k]の3次元配列があった場合、
A = AAA[i][j]
と1次元は配列として扱っている。そしてA[max]が4KB以下になるようにしている。
>>454 スカラーのコードもA,B,Cでループ内で処理している。
やっぱり、スラッシングが原因なのかなあ?
とりあえず、境界を合わせて128[bit]ずつnon temporalな書込みをする。
Cだけ_mm_stream_psにしても変わらないならA,B,Cだけが原因じゃなさそうだ。 計算群1,2,3で参照しているメモリがA,B,Cとスラッシングしてるんじゃないかな。 なので、こうしたらどうだろう? for () {SSEの計算群1-> 結果をA[i]} for () {SSEの計算群2-> 結果をB[i]} for () {SSEの計算群3-> 結果をC[i]} これでも計算群1で参照しているメモリがA[i]とスラッシングしてたらお手上げなんだけど。
458 :
443 :2010/07/01(木) 01:21:40
>>456 >>457 いろいろと調べてみたら、キャッシュの問題ではなくて、
NUMAノードの設定が問題だったようだ。
メモリの確保をmalloc()ではなく、numa_alloc_onnode()でダイレクトにNUMAノードを指定してあげたら、
ほぼスカラーの倍の速度が得られたよ。
numactlをつかって、--preferred=nodes --localallocとかいろいろといろいろとオプションを
つけてやってみたけど、うまく指定したノードでのメモリ割り当てが出来ていなかったみたい。
いずれにしてもSSEの問題ではなかったので、変な質問をして申し訳ない。
レスしてくれた人ありがとう。
ただ、プリフェッチの指定をしていた部分でNehalemではかなり効果があったのが、
Opteronでは全く効果が無いので、プリフェッチの距離とかはOpteron用に考えないといけない様だ。
OpteronのNUMAは諸刃の剣だな。ハマればメモリの許す限りスケールするしな。 ていうかSMP Opteron由来の問題とは俺も気付かなかった。
460 :
デフォルトの名無しさん :2010/07/23(金) 11:32:54
(000、000)10 ー10、835 とかいう問題