問題タブ [single-precision]

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.

0 投票する
2 に答える
311 参照

c - 単精度浮動小数点のみを使用して [0,pi] の余弦を近似する

私は現在、余弦の近似に取り組んでいます。最終的なターゲット デバイスは 32 ビット浮動小数点 ALU/LU で動作する自己開発であり、C に特化したコンパイラがあるため、C ライブラリの数学関数 (cosf など) を使用できません。精度と命令/サイクル数の点で異なるさまざまな方法をコーディングすることを目指しています。

fdlibm、テイラー展開、パデ近似、maple を使用した remez アルゴリズムなど、さまざまな近似アルゴリズムを既に試しました。

しかし、浮動小数点精度のみを使用してそれらを実装するとすぐに、精度が大幅に失われます。そして、確かに:倍精度では、はるかに高い精度がまったく問題にならないことを私は知っています...

現在、pi/2 (最大のエラーが発生する範囲) 付近で数千 ulp までの正確な近似値がいくつかありますが、単精度変換によって制限されていると感じています。

トピックの引数削減に対処するには: 入力はラジアンです。引数を減らすと、除算/乗算により精度がさらに低下すると思います....私の全体的な入力範囲は0..piしかないので、引数を0..pi/2に減らすことにしました。

したがって、私の質問は次のとおりです。コサイン関数の単精度近似を高精度 (および最良の場合は高効率) で知っている人はいますか? 単精度の近似を最適化するアルゴリズムはありますか? 組み込みの cosf 関数が内部的に単精度または倍精度で値を計算するかどうか知っていますか? 〜

情報を忘れた場合は、お気軽にお問い合わせください。

前もって感謝します

0 投票する
3 に答える
168 参照

c# - float に格納されている正確な値を出力するにはどうすればよいですか?

値 0.1 を float に割り当てると:

0.1 は単精度浮動小数点形式で正確に表現できる数値ではないため、メモリに格納される実際の値は 0.1 の正確な表現ではありません。格納されている実際の値は、計算を正しく行った場合です。

しかし、C# でその値を出力する方法を特定できません。数値を小数点以下の桁数まで出力するように依頼しても、正しい答えは得られません。

float に格納されている正確な値を出力するにはどうすればよいですか。メモリ内のビットパターンによって実際に表される値?

編集:他の場所で、.NET Core および .NET 5.0 で標準の書式文字列を使用して、私が求める動作を得ることができることに注意を向けました。したがって、この質問は .NET Framework 固有のものだと思います。

0 投票する
1 に答える
86 参照

floating-point - 単精度 IEEE-754 で 2^(-23) を表現しようとすると「変換によるエラー」を把握できない

0.13.140.2、および 2 の累乗の組み合わせで構成できないその他の値が、IEEE-754 形式では最終的に表現できない理由を理解しており、精度が許す限り最適に近似することができると言って、質問の前置きをさせてください。.

私が理解に苦しんでいるのは、値2 -23を表現しようとすると、わずかな誤差が生じる理由です。

2 -231.1920928955078e-7は、またはと正確に等しくなり0.00000011920928955078ます。単精度 IEEE-754 では、次のように構成できます。

  • 符号ビットは0
  • バイアスされた指数は104(または0b01101000バイナリで) 127 バイアスを考慮し-23て、最終的な指数値になります。
  • 仮数のビット フィールドは完全に0s で構成され、その最終的な値は1.0、暗黙の1-bit が考慮される場合です。

ただし、この特定のビット シーケンスをメモリに保存し、小数点以下 25 桁の精度で 10 進表記で出力すると、次のようになります。

この値には正確に の誤差が含まれています1.25e-21。このインタラクティブ Web サイトでは、このエラー値を「変換によるエラー」と呼びます。

これを理解するのに苦労しています。たとえば、 のような値+3.14を単精度ビットフィールドで正確に表現できない理由を理解しているからです。指数の値でスケーリングされた仮数部の 2 の負のべき乗の組み合わせは を正確に表すことができ3.14ないため、次に近い近似値が選択されます。したがって、「変換によるエラー」が予想されます。それとは対照的に、値2 -23は単精度ビットフィールドに正確に格納できますが、10 進数表記に戻すとエラーが発生します。

明らかに私の側にある種の誤解がありますが、どこが正確かわかりません。