2

この質問を始める前に、私たちが開発しているタイプのハイ パフォーマンス アプリケーションの場合、BigDecimal は容認できないほど遅いと述べます。これは妥協できません。

私たちのドメインでは、さまざまなレベルの精度で約 100,000,000 までの値を表します (これまでに見つかった最も難解なケースでは、これは小数点以下 6 桁になる可能性があります)。

以上のことから、任意の精度で通貨情報を表現する方法が 2 つあります。1 つ目は、 JSR-354で説明されているものと同様のパターンに従うことです。ここで、long は値の仮数を表し、short (または int) は指数を表します。この場合、値 12345.6789 は内部的に次のように表されます。

long mantissa = 123456789L;
short exponent = -4;

これにより、任意の精度で 18 桁を表すことができます (9223372036854775807 は 19 桁です)。

2 つ目は、double を使用して値を表し、イプシロンを使用して、浮動小数点数の計算を実行することによって導入されたエラーを四捨五入します。すべてのコンピューター科学者が浮動小数点演算について知っておくべきことといくつかの実験についての私の理解に基づいて、選択した任意の精度で 17 の数値を表すことができると信じています。固定イプシロンを使用する場合、予想される最大小数点以下 6 桁の要件で 99999999999.999999 までの値を表すことができ、イプシロンは導入されたエラーを四捨五入できます。


これらのパターンのいずれかが、私たちが取り組んでいるドメインにとって「最適」と見なされるかどうかはわかりません.

異なる精度で 2 つの値に対して操作を実行する必要がある場合、長い/短いパターンでは、位置シフト ロジックを実装する必要があります (これが必要になります)。これにより、特定の操作で double/epsilon を使用するよりも遅くなると思いますが、確認していません。一方、double/epsilon を使用すると、丸めを実行するための計算ごとに小さなオーバーヘッドが発生します。

必要に応じて、どちらも拡張してより多くの桁数を提供できます。JSR-354 では、任意の精度で最大 37 桁を提供する long/long/int 実装について言及しています。このペーパーでは、double-double 型と quad-double 型の C++ 実装について説明します。

特定の正当化なしに「通貨に浮動小数点を使用しない」にすぐに下がらない、他のいずれかの利点/欠点に関する議論を見つけることができませんでした-パフォーマンスが主要でない場合、私は同意するマントラです懸念されますが、この場合、私には確信が持てません。

4

2 に答える 2

0

これらのパターンのいずれかが、私たちが取り組んでいるドメインにとって「最適」と見なされるかどうかはわかりません.

ドメインが何であるかについて言及していないので、それについてコメントするのは難しい.

ただし、多くの財務関連システムは、会計の一般規則によって管理されています。これらは、財務計算の実行方法について明確であり、浮動小数点は受け入れられません。

ドメインが会計規則の対象である場合、浮動小数点を使用することは実際には選択肢ではありません。

そうでない場合は、数学的な分析を行って、浮動小数点に固有の不正確さが計算結果に違いをもたらすかどうかを判断する必要があります。より広い浮動小数点型を単に使用するのは良い答えではありません...計算の結果にエラー境界を設定するために「計算を行った」場合を除きます。

または、分析を避けて、スケーリングされたlongorを使用しますBigDecimal。(ただし、スケーリングされlongている場合は、オーバーフロー/アンダーフローの問題を考慮する必要があることに注意してください。)


あなたが「計算を行って」おり、会計規則(またはそのようなもの)によって制限されていない場合:

  • 浮動小数点型は、算術を行うときにスケール係数をいじる必要がないため、使いやすくなります。(縮尺係数が暗黙的であっても、考慮する必要があります...)

  • 浮動小数点型は、標準ライブラリ メソッドで「そのまま機能」します。たとえば、Math静的メソッド。

  • 浮動小数点コードは読みやすくなり、プログラミング ロジック エラーが発生しにくくなります。

  • 浮動小数点型は不正確です...しかし、計算を正しく行っていれば、それは問題ではありません。(完全な数学的分析により、計算中に結果が不正確になるところまで誤差が蓄積されているかどうかがわかります。)

パフォーマンス...とは言い難い。それはおそらく実際の計算に依存します。私のアドバイスは、重要な計算を両方の方法でコーディングし、慎重にベンチマークすることです。

于 2013-02-13T13:47:08.967 に答える