- 1 名前:デフォルトの名無しさん [2008/01/04(金) 14:25:44 ]
- 主にx86系で浮動小数点を扱う話題
- 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
無理数
- 105 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 12:48:41 ]
- 80287と80287XLはパフォーマンスの向上以外には具体的にはどのような非互換性があるんだろう
- 106 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 12:55:52 ]
- 多倍長計算とBCD計算の違いについて教えてください
- 107 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 13:07:37 ]
- BCD は 1 桁を 0〜9 で扱う。
多倍長計算はそういう制限がない。
- 108 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 13:47:36 ]
- BCDの多倍長は?
- 109 名前:日本語に不自由する人はこれだから困る mailto:sage [2008/01/27(日) 15:24:05 ]
- >>108
BCDという制限がついた多倍長。
- 110 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 15:49:23 ]
- BCD は BCD 用の命令が CPU に備わってることがある。
- 111 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 20:47:35 ]
- >>86
整数命令で大小判定できるからじゃん? バイアスでなくて2の補数とかにしたい気持ちはよく解るが。
- 112 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 10:23:49 ]
- >>92 MSX-BASICをお使いください
- 113 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 10:24:53 ]
- DAAとかx86_64では無くなってるんでしょ?
- 114 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 14:31:31 ]
- MSX-BASICの浮動小数点
符号部 ibit 指数部 7bit 0x40のげた付き10のべき 仮数部 短精度 24bit 倍精度 56bit 正規化されたBCD(6桁/14桁)
- 115 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 20:05:49 ]
- >>111
> >>86 > 整数命令で大小判定できるからじゃん? それはゲタが1024だとできないの?
- 116 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 02:55:27 ]
- >>111
2の補数用の比較命令使いたかったらまず仮数部をだな
- 117 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 13:13:46 ]
- windowsの電卓オススメ
- 118 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 01:23:30 ]
- >>117
>windowsの電卓オススメ ヘルプによると一部有理数を使えるようだな。感心感心。 がしかし、関数電卓にすると平方根ボタンが消えるのはなぜだ? どうやら平方根は関数ではないらしい。 [x^2]の逆関数で何とかしのげるが。
- 119 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 01:32:16 ]
- 1/2乗って知ってる
- 120 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 01:33:01 ]
- x^2 の逆関数でいけるからボタンが無いんだよ
- 121 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 01:53:26 ]
- x^yの意味がわかってないな
- 122 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 01:57:21 ]
- XOR だよね!
- 123 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/01/30(水) 02:07:00 ]
- そうだね累乗はx**yだね
- 124 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 03:09:32 ]
- もれは1/2計算するの面倒だから
.5乗している
- 125 名前:ヽ・´∀`・,,)っ━━━━━━┓ mailto:sage [2008/01/30(水) 03:17:50 ]
- ActiveScriptRubyについてるirbが便利。
- 126 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 15:06:54 ]
- [3][x^y][1][.][5][=]
[3][Inv][x^2]
- 127 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 17:54:58 ]
- 普通の電卓に平方根がついてる意味がわからん。標準偏差に使うのか?
簡単なループで計算できるからつけてみたら、その後ほぼ標準装備になったとか?
- 128 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 18:19:02 ]
- >>117 浮動小数点は文字列を使えという主張ですか
- 129 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 18:25:49 ]
- 0.1が正確に表現できるって意味じゃないか
- 130 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 18:38:36 ]
- BCD最強説
- 131 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 19:07:27 ]
- BCDは固定長です。
- 132 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 23:02:59 ]
- COBOLのパック形式をBCDと呼ぶのが正しいのだろうけど、
仮数部 X 10の指数部乗 の形式や 小数点以上32bit+小数点以下32bitといった10進数の表現も多い。
- 133 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 23:11:32 ]
- BCD で可変長は可能だろ。
- 134 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 07:01:47 ]
- >>117
Windowsの電卓をコマンドラインから実行して計算結果をもらうにはどうすればよいのでしょう?
- 135 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 08:14:24 ]
- >>127
ttp://www.njg.co.jp/d/3594.html ttp://www.t-ueda.jp/edu-momo/chi_faq/2/route.htm
- 136 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 00:55:33 ]
-
∧∧ ミ _ ドスッ ( ,,)┌─┴┴─────────┐ / つ ここでユークリッドの互除法. │ 〜′ /´ └─┬┬―───────―┘ ∪ ∪ ││ _ε3
- 137 名前:デフォルトの名無しさん [2008/02/10(日) 11:54:35 ]
- >>103
8087 デフォルトの射影的無限大ってよく解らないんだけど。 Projective モードで tan(90.000・・・°) を計算すると、 無限大の符号はどっち向くの?
- 138 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:05:48 ]
- (90.000・・・°のラジアンは表現できない
8087FPTANのパラメータは[0, π/4)の範囲 8087デフォルトでは-∞と+∞の相違は意味が無い(+0,-0と同様) 実際には、80bit-->64bitの変換で色々起こると思う
- 139 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 02:09:12 ]
- BCD信者に
89.999… == 90.000… が真であることを証明してもらおうか。
- 140 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 12:29:46 ]
- IEEE754信者も
- 141 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 14:14:23 ]
- IEEE754に循環小数は存在しませんっ。
先生そんなの認めませんっ。 無限桁BCDは世界最強なんだろ? 手始めに等号判定を実装してもらおうじゃないのさ。 アルゴリズムだけでもいいから示してくれ。 等号すら満足に行えない数値表記なんて何の役に立つ?
- 142 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 10:16:56 ]
- 有限桁演算だと結局等号の意味が薄い件
- 143 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:37:48 ]
- マシンイプシロンくらい気にしろと
- 144 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 14:24:03 ]
- じっすうのひかくにとうごうをつかっちゃいけないって
おかあさんがゆってた
- 145 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 21:28:35 ]
- >>144
ではどうしろと? A-Bが0だからといってA==Bとは限らない。 ママにそういってこい。
- 146 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 21:50:29 ]
- >>145
どうもこうも、不等号を使うしかないだろ。
- 147 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 21:56:15 ]
- 差が何らかの閾値以下かどうかチェックするのが常套手段
- 148 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 00:13:46 ]
- >>147
そうそう、マシンイプシロンあたりで。宿題スレでよくみます。
- 149 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 00:45:06 ]
- >>143
>>148 マシンイプシロンと等号になんの関係が? まさか、まさかとは思うが、君達は A==B を判定するのに A÷B させて1.0に迫るのを眺めているわけではないよな?
- 150 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 09:12:37 ]
- マシンイプシロンの精度で数値解析できれば苦労しないw
- 151 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 13:52:32 ]
- まさにA==Bを判定する必要がある場面を例示せよ。
行列ならほとんど積和算だし ソートは大小比較であり等号なんて使わない。 もしかして実数データをstable sortでもしたいのかい?
- 152 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 15:24:07 ]
- Aさんが直線上を時速2キロで歩いています。
Aさんの5キロ後方のBさんが時速3キロでAさんを追いかけ始めました。 おっと、A,B間を往復する時速5キロの犬が同時にBさんのもとを出発しました。 さて、ここで問題です。 (続く)
|

|