タグ付けされた質問 「floating-point」

有効数字の固定数と、ある基本数の指数で数値を表す方法。それらは、の形式で特徴付けられ ます。通常、数値はbase = 2(2進数)で表されます。 sgfcatdgtsbaseeバツpoet

17
Python用の高品質な非線形プログラミングソルバーはありますか?
解決すべきいくつかの挑戦的な非凸のグローバル最適化問題があります。現在、MATLABのOptimization Toolbox(特にfmincon()algorithm ='sqp'を使用)を使用していますが、これは非常に効果的です。ただし、私のコードのほとんどはPythonで作成されているため、Pythonでも最適化を行いたいと考えています。競合できるPythonバインディングを備えたNLPソルバーはありfmincon()ますか?ちがいない 非線形等式および不等式の制約を処理できる ユーザーがヤコビアンを提供する必要はありません。 グローバルな最適化を保証していなくても構いません(保証fmincon()しません)。私は、困難な問題や、それよりもわずかに遅い場合でも、ローカル最適にロバストに収束するものを探していfmincon()ます。 OpenOptで利用できるソルバーをいくつか試しましたが、MATLABのソルバーより劣っていfmincon/sqpます。 強調するために、私はすでに扱いやすい定式化と優れたソルバーを持っています。私の目標は、ワークフローをより合理化するために、単に言語を変更することです。 Geoffは、問題のいくつかの特性が関連している可能性があると指摘しています。彼らです: 10-400の決定変数 4〜100の多項式等式制約(1〜8の範囲の多項式次数) 決定変数の数の約2倍に等しい合理的な不等式制約の数 目的関数は決定変数の1つです 不等式制約のヤコビアンと同様に、等式制約のヤコビアンは密です。

2
log1pとexpm1はいつ使用する必要がありますか?
Google にとって非常に難しい簡単な質問があります(すべてのコンピューター科学者が浮動小数点演算ペーパーについて知っておくべき標準的なもの以外に)。 andなどの代わりにlog1por などの関数をexpm1使用する必要があるのはいつですか?いつ使用すべきではありませんか?これらの関数の異なる実装は、使用法の点でどのように異なりますか?logexp

5
シンボリック式から数値的に正確な浮動小数点Cルーチンを自動生成できるソフトウェアはありますか?
実変数の実関数が与えられた場合、IEEE 754算術を搭載したマシンのすべての入力で関数を計算するための数値的に正確なコードを自動的に生成できるソフトウェアはありますか? たとえば、評価される実関数が次の場合: ソフトウェアは、致命的なキャンセルと、特定の入力セットの出力テーブル検索を考慮して、計算精度の低下を回避します。 あるいは、純粋なテーブルベースのルックアップルーチンを生成して、特定の関数を高精度で計算できるソフトウェアはありますか?

4
オーバーフローエラーなしで大きな指数項を確実に追加する方法は?
マルコフ連鎖モンテカルロ法の非常に一般的な問題には、大きな指数項の合計である確率の計算、 ea1+ea2+...ea1+ea2+... e^{a_1} + e^{a_2} + ... のコンポーネントは非常に小さいものから非常に大きいものまであります。私のアプローチは、最大指数項た。aaaK:=maxi(ai)K:=maxi(ai)K := \max_{i}(a_{i}) a′=K+log(ea1−K+ea2−K+...)a′=K+log(ea1−K+ea2−K+...)a' =K + log\left( e^{a_1 - K} + e^{a_2 - K } + ... \right) ea′≡ea1+ea2+...ea′≡ea1+ea2+...e^{a'} \equiv e^{a_1} + e^{a_2} + ... このアプローチは、aのすべての要素aaaが大きい場合は妥当ですが、そうでない場合はそれほど良い考えではありません。もちろん、小さな要素は浮動小数点の合計に寄与しませんが、それらを確実に処理する方法はわかりません。Rコードでは、私のアプローチは次のようになります。 if ( max(abs(a)) > max(a) ) K <- min(a) else K <- max(a) ans <- log(sum(exp(a-K))) + ...

10
ソートされた数値の配列の合計を計算するのに、どのアルゴリズムがより正確ですか?
与えられるのは、正数増加する有限シーケンスです。次の2つのアルゴリズムのうち、数値の合計の計算に適しているのはどれですか?z1、z2、。。。。。znz1、z2、。。。。。znz_{1} ,z_{2},.....z_{n} s=0; for \ i=1:n s=s + z_{i} ; end または: s=0; for \ i=1:n s=s + z_{n-i+1} ; end 私の意見では、エラーはますます小さくなるので、最大の番号から最小の番号に番号を追加し始める方が良いでしょう。また、非常に大きな数値を非常に小さな数値に加算すると、近似結果が大きな数値になる可能性があることもわかっています。 これは正しいです?他に何が言えますか?

6
C ++関数の数値エラーの分析
入力として複数の浮動小数点値(単一または二重)を受け取り、何らかの計算を行い、出力浮動小数点値(単一または二重)を生成する関数があるとします。私は主にMSVC 2008で作業していますが、MinGW / GCCでも作業する予定です。私はC ++でプログラミングしています。 結果に含まれるエラーの量をプログラムで測定する一般的な方法は何ですか?私は任意精度ライブラリを使用する必要があると仮定します:速度を気にしない場合、そのような最適なライブラリは何ですか?

1
ログサムの壊滅的なキャンセル
相対誤差の少ない倍精度浮動小数点で次の関数を実装しようとしています。 logsum(x,y)=log(exp(x)+exp(y))logsum(x,y)=log⁡(exp⁡(x)+exp⁡(y))\mathrm{logsum}(x,y) = \log(\exp(x) + \exp(y)) これは統計アプリケーションで広く使用され、ログスペースで表される確率または確率密度を追加します。もちろん、またはは簡単にオーバーフローまたはアンダーフローする可能性がありますが、そもそもログスペースがアンダーフローを回避するために使用されるため、これは悪いことです。これが典型的な解決策です。exp(x)exp⁡(x)\exp(x)exp(y)exp⁡(y)\exp(y) logsum(x,y)=x+log1p(exp(y−x))logsum(x,y)=x+log1p(exp⁡(y−x))\mathrm{logsum}(x,y) = x + \mathrm{log1p}(\exp(y - x)) からのキャンセルは発生しますが、によって軽減されます。さらに悪いのは、とが近い場合です。相対誤差プロットは次のとおりです。y−xy−xy-xexpexp\expxxxlog1p(exp(y−x))log1p(exp⁡(y−x))\mathrm{log1p}(\exp(y - x)) プロットはれ、キャンセルが発生する曲線の形状を強調します。最大までのエラーが表示されましたが、さらに悪化すると思われます。(FWIW、「グラウンドトゥルース」関数は、128ビット精度のMPFRの任意精度の浮動小数点を使用して実装されます。) l o g s u m(x 、y )= 0 10 − 1110−1410−1410^{-14}logsum(x,y)=0logsum(x,y)=0\mathrm{logsum}(x,y) = 010−1110−1110^{-11} 私は他の改革を試みましたが、すべて同じ結果になりました。外側の式と、同じエラーがで1近く何かのログを取ることによって発生外側の表現として、キャンセルは、内側の式で行わ。l o g 1 ploglog\loglog1plog1p\mathrm{log1p} 現在、絶対誤差は非常に小さいため、相対誤差は非常に小さくなっています(イプシロン内)。ユーザーは(ログ確率ではなく)確率に本当に関心があるので、このひどい相対誤差は問題ではないと主張するかもしれません。通常はそうではない可能性がありますが、私はライブラリ関数を書いています。そのクライアントは、丸め誤差よりもそれほど悪くない相対誤差を期待できるようにしたいと思います。l o g s u mexp(logsum(x,y))exp⁡(logsum(x,y))\exp(\mathrm{logsum}(x,y))logsumlogsum\mathrm{logsum} 新しいアプローチが必要なようです。何だろう?

3
BLAS実装は、まったく同じ結果をもたらすことが保証されていますか?
2つの異なるBLAS実装を考えると、まったく同じ浮動小数点計算を行い、同じ結果を返すと期待できますか?または1つのようにスカラー積を計算することは、例えば、起こることができる そしてような一つ そうおそらくIEEE浮動小数点に異なる結果を与えます算術?((x1y1+ x2y2)+ x3y3)+ x4y4((バツ1y1+バツ2y2)+バツ3y3)+バツ4y4 ((x_1y_1 + x_2y_2) + x_3y_3) + x_4y_4 (x1y1+ x2y2)+ (x3y3+ x4y4)、(バツ1y1+バツ2y2)+(バツ3y3+バツ4y4)、 (x_1y_1 + x_2y_2) + (x_3y_3 + x_4y_4),

4
現在利用可能なGPUは倍精度浮動小数点演算をサポートしていますか?
24個のIntel Xeon CPUを含むノードで構成されるUbuntu Linuxクラスターで分子動力学(MD)コードGROMACSを実行しました。私の特定の関心のある点は、浮動小数点演算の精度に多少敏感であることが判明したため、GROMACSは、倍精度の計算コストが高いにもかかわらず、単精度ではなく倍精度で実行する必要がありました。そのため、クラスターでは、GROMACSを倍精度でコンパイルしました。 CPUに対して相対的な高速化(「GPUアクセラレーション」)が行われる可能性があるため、GPUの購入を検討しています。ただし、倍精度演算を実行できるGPUが必要です。そのようなハードウェアが市販されているかどうか知っていますか?GROMACSメーリングリストの最近の投稿は、倍精度のGPUは市販されていないことを示唆しています: ハードウェアはそれをサポートしていません[倍精度演算]まだ知らない。 このウィキペディアのページは、倍精度GPUは非効率的である可能性があるため、一般的でないことを示唆しているようです。 Nvidia GPUでの浮動小数点の実装は、ほとんどがIEEEに準拠しています。ただし、これはすべてのベンダーに当てはまるわけではありません。これは、いくつかの科学的応用にとって重要であると考えられている正確さに影響を及ぼします。CPUでは64ビット浮動小数点値(倍精度浮動小数点数)が一般的に使用可能ですが、これらはGPUでは普遍的にサポートされていません。一部のGPUアーキテクチャはIEEE準拠を犠牲にし、他のGPUアーキテクチャは倍精度を完全に欠いています。GPUで倍精度浮動小数点値をエミュレートする努力がありました。ただし、速度のトレードオフは、そもそもGPUに計算をオフロードする利点を無効にします。 このNVIDIA Teslaページは、チャートの「ピークの倍精度浮動小数点パフォーマンス」を参照する際に、実際には、GPUで倍精度計算を実行できることを示唆しているようです(計算コストは​​高くなりますが)。 だから、私は何を信じるべきですか?この問題の経験はありますか?


7
浮動小数点の2つの数値の平均のロバストな計算?
させて x、y2つの浮動小数点数のこと。それらの平均を計算する正しい方法は何ですか? 単純な方法で(x+y)/2は、次の場合にオーバーフローが発生する可能性があります。xでyは、大きすぎるがあります。0.5 * x + 0.5 * y多分もっと良いと思うかもしれませんが、それは2つの乗算(これは非効率かもしれません)を必要とし、それで十分かどうかわかりません。もっと良い方法はありますか? 私が遊んでいるもう一つのアイデアは (y/2)(1 + x/y) if x<=yです。しかし、繰り返しますが、これを分析し、それが私の要件を満たしていることを証明する方法がわかりません。 さらに、計算された平均がとになること>= min(x,y)を保証する必要があり<= max(x,y)ます。Don Hatchの答えで指摘されているように、この質問を提起するより良い方法は次のとおりです。つまり、xおよびyが浮動小数点数である場合、(x+y)/2?に最も近い浮動小数点数を計算する方法は?この場合、計算された平均は自動的に>= min(x,y)および<= max(x,y)です。詳細については、Don Hatchの回答を参照してください。 注:私の優先事項は堅牢な精度です。効率は消耗品です。ただし、堅牢で正確なアルゴリズムが多数ある場合は、最も効率的なアルゴリズムを選択します。

1
Python関数で壊滅的なキャンセルを避ける方法は?
関数を数値的に実装するのに問題があります。入力値が大きい場合、結果は非常に大きな数倍と非常に小さな数であるという事実に悩まされます。壊滅的なキャンセルが正しい用語であるかどうかはわかりませんので、正しい場合は修正してください。何かがおかしくなっている証拠: 6の大きな入力に対して、振動と0.0の割り当てを回避するにはどうすればよいですか? 私の機能は次のとおりです。 import numpy as np def func(x): t = np.exp(-np.pi*x) return 1/t*(1-np.sqrt(1-t**2))

4
浮動小数点演算で、小さな用語を大きな用語の差に追加すると、数値の不正確さが生じるのはなぜですか?
私は、アレンとティルデスリーによる「液体のコンピューターシミュレーション」という本を読んでいます。71ページ以降、著者は分子動力学(MD)シミュレーションでニュートンの運動方程式を統合するために使用されるさまざまなアルゴリズムについて説明します。78ページから、著者はVerletアルゴリズムについて議論します。これはおそらくMDの標準的な統合アルゴリズムです。彼らは述べています: おそらく、運動方程式を統合する最も広く使用されている方法は、Verlet(1967)によって最初に採用され、Stormer(Gear 1971)に起因するものです。この方法は、二次方程式の直接解であるmir¨i=fimir¨i=fim_i \ddot{\textbf{r}}_i = \textbf{f}_i。方法はpostionsに基づいてr(t)r(t)\textbf{r}(t)、加速度a (tで)、そして位置rを(T - δ T )前のステップから。位置を進める方程式は次のようになります。a(t)a(t)\textbf{a}(t)r(t−δt)r(t−δt)\textbf{r}(t - \delta t) r(t+δt)=2r(t)−r(t−δt)+δt2a(t).(3.14)(3.14)r(t+δt)=2r(t)−r(t−δt)+δt2a(t).\tag{3.14}\textbf{r}(t + \delta t) = 2\textbf{r}(t) - \textbf{r}(t - \delta t) + \delta t^2 \textbf{a}(t). eqn(3.14)について注意すべき点がいくつかあります。速度がまったく表示されないことがわかります。についてテイラー展開によって得られた方程式を追加することにより、それらは削除されました。r(t)r(t)\textbf{r}(t) r(t+δt)=r(t)+δtv(t)+(1/2)δt2a(t)+...r(t+δt)=r(t)+δtv(t)+(1/2)δt2a(t)+...\textbf{r}(t + \delta t) = \textbf{r}(t) + \delta t \textbf{v}(t) + (1/2) \delta t^2 \textbf{a}(t) + ... r(t−δt)=r(t)−δtv(t)+(1/2)δt2a(t)−....(3.15)(3.15)r(t−δt)=r(t)−δtv(t)+(1/2)δt2a(t)−....\tag{3.15}\textbf{r}(t - \delta ...

4
ライブラリ関数のFLOPカウント
単純な関数でFLOPの数を評価するとき、基本的な算術演算子を集計する式を単純にたどることができます。ただし、偶数除算を含む数学ステートメントの場合、これを行うことはできず、加算と乗算のみの関数からのFLOPカウントと比較できると期待されます。操作がライブラリに実装されると、状況はさらに悪化します。したがって、特別な機能のパフォーマンスについて合理的な考えを持つことが不可欠です。 特別な機能とは、次のようなものを意味します。 exp() sqrt() sin / cos / tan() 通常はシステムライブラリによって提供されます。 これらの複雑さの決定は、それらの多くが適応性があり、入力依存の複雑さを持っているという事実によってさらに混乱します。たとえば、exp()の数値的に安定した実装は、多くの場合、適応的に再スケーリングしてルックアップを使用します。ここでの私の最初の印象は、この場合にできる最善の方法は、関数の平均的な動作を確認することです。 この議論全体は、もちろん、アーキテクチャに大きく依存しています。この議論では、従来の汎用アーキテクチャに限定し、特別な機能ユニット(GPUなど)を持つアーキテクチャを除外できます。 システムとシステムの比較のために、特定のアーキテクチャ向けにこれらを標準化するかなり簡単な試みを見つけることができますが、メソッドとメソッドのパフォーマンスを重視する場合、これは受け入れられません。これらの関数のフロップの複雑さを決定するためのどの方法論が受け入れられると考えられますか?大きな落とし穴はありますか?

1
計算方法が改善されていますか?
ほとんどの数学ライブラリには、対数関数の多数のバージョンがあります。ほとんどの場合、それらは完璧であると仮定しますが、実際にはかなりの数の精度が一定の桁数で提供されています。 一部の関数には、数値的に安定したバリアントがあります。たとえば、Fortran、R、Java、Cの両方にはMath.log1p、計算用にlog(1.0+x)(xの小さな値に対してより高い精度を提供する)と、対応するがありexpm1ます。ここで、数値の問題は精度の低下から発生します- x本当に小さい場合1.0 + x、先頭の1を保持するために桁が失われます。 私は、多くの状況で精度を高めるためのそのような関数を見てきました。これは、高い数値精度で分布関数(ガンマ、ベータ、ポアソンなど)を実装する場合によくあるようです。たとえば、ガンマ関数はほとんどの場合、として使用されlogGammaます。一般に、「ログスペース」に移動すると精度が大幅に向上する可能性があるため、ほとんどの関数にはRに「ログスペース」フラグが設定されているようです。 別の例では、Rは、存在log1mexpのためにlog(1 - exp(p)): http://cran.r-project.org/web/packages/Rmpfr/vignettes/log1mexp-note.pdf エントロピーと情報理論的手段で遊んでいます。非常に一般的な用語があります p * -log(p) 通常、対数の底はeではなく2になります。しかし、これは多くの場合、これは線形要因に過ぎず、自然対数も使用できます(したがって、これは私にとって重要ではありません)。とにかく、この用語をより速く/より直接的に/より正確に計算する方法があるかどうか知っていますか?私はあちこちでそれを持っているので、それをもう少し正確かつ高速にするために本当に成果を上げることができます(通常の「時期尚早な最適化」のものをありがとう、ありがとう)。 精度の低下を引き起こす明白な理由は見当たりません。そのため、この計算を高速化するための素晴らしいトリックがあるかどうかに主に興味があります。それはおそらく私がp=0コーナーケースを処理することを節約することもあります(これは存在し0ますlog(0)が、存在しませんが)、ベース2を無料で提供します(ただし、定数との単一の乗算は明らかに高価ではありません)。ありがとう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.