既存のシステムで使用されている式を再構築しようとしているときに問題がありました。これは、1 つの入力と 1 つの出力のかなり単純な式です。
y = f(x)
多くの困惑の後、観測されたデータポイントに適合する式を見つけることができました。
ご覧のとおり、私たちの理論モデルは観測データに非常によく適合しています。
残差エラー (つまり ) をプロットする場合を除いy = f(x) - actualY
て、残差にいくつかの線が表示されます。
これらの線が、式に中間の丸めを適用した結果であることは明らかでしたが、どこにあるのかは明らかではありませんでした。最終的に、元のシステム (リバース エンジニアリングしようとしているシステム) が中間Decimal
データ型に値を格納していることが判明しました。
- 小数部の8ビット精度で
- 0.5 の切り上げ丸めモデルを使用します。
この 8 ビット精度を小数部でシミュレートするには、次のようにします。
multiply by 128 (i.e. 2^8)
apply the round
divide by 128 (i.e. 2^8)
上記の式を次のように変更します。
これにより、残差が大幅に減少します。
さて、上記のすべては私の質問とは関係ありませんが、次の点を除きます。
Single Precision
今、浮動小数点数を使用するプログラミング言語 (および Excel) 内で浮動小数点数をシミュレートしたいと考えていDouble Precision
ます。それが必要だと思うので、私はこれをやりたいです。
上記の例では、元のシステムはDecimal data type with fixed 8-bit fractional precision using 0.5 round-up rules
. 次に、その計算モデルをDouble
数学でシミュレートする方法を見つけなければなりませんでした。元のシステムは精密演算を使用していると思いますSingle
が、それを使用してシミュレートしたいと考えていますDouble
。
double を使用して単精度丸めをシミュレートするにはどうすればよいですか?
私の現在のモデルでは、通常の線形パターンに分類される残差が再びあります。これは、丸めの明らかな兆候です。
問題は、入力変数が大きくなるにつれて、エラーが大きくなり、目に見えるだけになることです。これは、すべての浮動小数点数がIEEE 754の「科学表記法」に正規化されていることが原因である可能性が高いことに気付きました。
たとえ間違っていたとしても、私はまだそれを試してみたいと思っています。
試したくない場合でも、まだ質問しています
Single
を使用して精度の丸めをシミュレートするにはどうすればよいDoubles
ですか?
最初に値を「正規化」できる限り、「8小数ビット後の丸め」の概念を適用できるようです(ただし、精度浮動小数点の場合は24ビットです) 。例えばSingle
1234567898.76543
に変換する必要があります (に似たもの):
1.23456789876543 E-09
次に、「24 番目のビットに丸め」を適用できます (つまり、2^24 = 16,777,216)。
floor(1.23456789876543E-09 * 16777216 + 0.5) / 16777216;
sign
問題は、 、abs
、ln
、exp
(または他の関数)のどの組み合わせを適用して、値を「正規化」し、それを n 番目のバイナリ桁に丸めてから「非正規化」できるかということです。
注:IEEE表現がバイナリ1
を最上位ビットとして保持していることを認識しています。正しい結果を得るために、その動作を繰り返す必要はないかもしれません。したがって、これは取り決めを破るものではなく、アプローチ全体が失敗であると示唆する原因にもなりません。