問題タブ [numerical-stability]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
r - 1に近い数の累乗
私が見つけることができなかったいくつかの標準的なトリックがあると思います: とにかく、数値的に安定した方法で 1 に非常に近い数 (p<1e-17 である 1-p を考えてください) の大きな累乗を計算したいのです。 . 私のシステムでは、1-p が 1 に切り捨てられます。
対数のテイラー展開を使用して、次の境界を取得します
もっと賢くできることはありますか?
c# - float を UInt32 に変換する - どちらの式がより正確か
float x
<0,1> の範囲内にあるはずの数値がありますが、いくつかの数値演算が行われます。結果は <0,1> からわずかに外れている可能性があります。
uint y
この結果を の全範囲を使用するように変換する必要がありUInt32
ます。もちろん、x
<0,1> の範囲でクランプしてスケーリングする必要があります。
しかし、操作のどの順序が優れているのでしょうか?
また
つまり、最初にスケーリングしてから、クランプまたはクランプしてからスケーリングする方が良いですか? 私は IEEE の浮動小数点表現にあまり詳しくありませんが、上記の式の計算順序に違いがあると思います。
floating-point - 数値安定性 - 乗算/除算は除算/乗算よりも正確な値を示しますか?
次のコードを検討してください。
これは実際にはこれです:
次のように手動で書くこともできます。
除算と比較して、乗算はより単純な操作であり、丸め誤差の影響を受けにくいという印象を受けています。
また、私は、ほとんどの日常の人間の数について、除算する前に乗算演算によって「より大きな数」が生成されると感じています (使用される数はしばしば 1 より大きいと仮定します)。また、割った後の数値が大きいほど、数値的に安定します。例 ..5 * 7 / 2.3
最初の操作 (mult) が正確である場所を検討してください。これらの数値は正確に 2 進数で表されます。次に、除算が行われ、取得しようとしているのと同じくらい正確になります。しかし7 / 2.3 * 5
、最初の演算が除算であり、すでに 2 進数で正確に表現できない数を生成し、次の演算 (mult) が乗算によって不正確さを誇張している場合を考えてみましょう。
私の質問は基本的に...これは問題ですか?除算を最初に使用すると実際に精度が失われますか?それとも、自分に最適な操作の順序を使用しても完全に安全であり、同じ結果が得られますか?
c - C 浮動小数点演算: 複数の間違った答え
大規模な C プログラミング プロジェクトで数値の問題が発生しています。(これは統計調査であり、クラスの宿題ではありません)。1 つのステップでは、sqrt(x^2 + y) - x を計算します。これは正である必要がありますが、x > 0 かつ y > 0 の場合でも、sqrt(x^2 + y) - x < 0 になることがあります。例:
私の出力:
この出力には、奇妙な動作が散らばっています。ハイライト:
- y 0.0062529947 を割り当てましたが、0.00625299476087093353271484375 として出力されます。
- x*x + y は x*x と同じ値として出力されます。
- sqrt(x*x + y) - x < 0.
なぜ 1-3 が発生するのですか?
言及する必要があります: この例は、gcc バージョンの 64 ビット Mac OX 10.9.4 マシンの両方で実行しました。
および gcc バージョンの 64 ビット CentOS サーバー:
また、コンパイルはどちらのマシンでもエラーや警告を返しませんでした:
c++ - XY 座標を角度に変換するための GLSL の堅牢な atan(y,x)
GLSL (具体的には私が使用している 3.00) には 2 つのバージョンがあります
atan()
: atan(y_over_x)
-PI/2、PI/2 の間の角度のみを返すことatan(y/x)
ができますが、4 つの象限すべてを考慮に入れることができるため、角度範囲は -PI からすべてをカバーします。 PI、 atan2()
C++とよく似ています。
atan
2番目を使用してXY座標を角度に変換したいと思います。ただし、atan()
GLSL では、 の場合に処理できないほか、x = 0
あまり安定していません。特に がx
ゼロに近い場合、除算がオーバーフローして結果の角度が反対になる可能性があります (約 PI/2 になるはずの場所で -PI/2 に近い値が得られます)。
atan(y,x)
より堅牢にするために GLSL の上に構築できる優れた単純な実装は何ですか?
matlab - 非常に小さな入力で行列方程式を解く
私はMatlabでプログラミングしており、私のプログラムではシステムを解く必要があります。Ax=b
ここで、A
は非常に小さなエントリm
をm
持つ正方行列です。増加するとm
、 のエントリはA
小さくなります。
A
は疎行列なので、この行列の名前sparse
を Matlab: の関数で変更しますB=sparse(A)
。
特別な方法を使用して、Bx=b
アンダーフローや数値エラーなしで解決できますか?
c# - .NET での数値の不一致
C# で CAD のようなアプリケーションを作成しています。私はSlimDX
グラフィックス エンジンとして使用しており、数値計算の部分では、最終的に System.Math クラスに当然依存するカスタム ライブラリを構築しています。
ここで問題なのは、SlimDX
ライブラリが float データ型で構成される構造体を使用しているのに対し、Math クラスには double オブジェクトのみを受け入れて返すメソッドがいくつか含まれていることです。たとえば、Math.Ceiling や Math.Sin です。そのため、データを常に float から double にキャストしていることに気づきます。
これは正しくないようです。キャストがパフォーマンスに与える影響についてはあまり関心がありません (そうすべきではないでしょうか?) が、それらが原因で発生する可能性のある数値の不安定性については、はるかに恐ろしいことです。
ですから、あなたがこのような状況にどのように対処しているのかを知りたかったのです。これは珍しいシナリオではないと思うからです。
algorithm - 関数近似アルゴリズムの誤差範囲
「m」ビットの仮数部と「e」ビットの指数部を持つ浮動小数点数のセットがあるとします。さらに、関数 "f" を近似したいとします。
理論から、通常は「範囲縮小関数」が使用され、そのような関数からグローバル関数値が導出されることがわかっています。
たとえば let x = (sx,ex,mx) (sign exp and mantissa) then... log2(x) = ex + log2(1.mx) したがって、基本的に範囲縮小関数は「log2(1.mx)」です。 .
現在、逆数、平方根、log2、exp2 を実装していますが、最近、三角関数を使い始めました。しかし、グローバルエラーバウンド(特にulpエラー)が与えられた場合、範囲縮小関数のエラーバウンドを導出することが可能である場合、私はさまよっていました。この種の問題に関する研究はありますか?log2(x) といえば (例として) 私は言うことができるようになる.
「k ulp エラーを含む log2(x) が必要です。これを実現するには、浮動小数点システムを考えると、log2(1.mx) を p ulp エラーで概算する必要があります」
私が言ったように、私たちは浮動小数点数を扱っていることを知っていますが、フォーマットは一般的であるため、古典的な F32 である可能性がありますが、たとえば e=10、m = 8 などです。
私は実際にそのような種類の研究を示す参考文献を見つけることができません. 私が持っている参考文献 (つまりミュラーの本) はこのトピックをこのように扱っていないので、ある種の紙などを探していました。リファレンスを知っていますか?
私もそのような束縛を自分で導出しようとしていますが、簡単ではありません...
python - ゼロを追加するときの奇妙な numpy.sum の動作
数学的に同等の算術演算が、数値エラー (たとえば、浮動小数点数を異なる順序で合計するなど) によって異なる結果になる可能性があることを理解しています。
ただし、ゼロを追加するsum
と結果が変わる可能性があることに驚きました。これは、何があってもフロートに常に当てはまると思いました: x + 0. == x
。
これが例です。すべての行が正確にゼロになると予想していました。なぜこれが起こるのか誰か説明してもらえますか?
M
との値が小さい場合は発生しないようですZ
。
私も確認しa.dtype==b.dtype
ました。
もう 1 つの例を次に示します。これは、Python のビルトインsum
が期待どおりに動作することも示しています。
numpy V1.9.2 を使用しています。