5

私は財務データを扱っているので、それがたくさんあり、比較的高精度(64ビット浮動小数点以上)である必要があります。

私の職場での標準的な慣習は、すべてをc#10進型として表すことのようです。これは、丸めのないbase10操作をサポートするために特別に作成された128ビット幅の浮動小数点です。

64ビットは代表的な精度を維持するのに十分な幅があるため、すべての計算(mult、div、addなど)でデータをより広い型にキャストしてから、64ビットに戻してメモリに格納するのはばかげています(その時ならほとんど)?

参考までに:メモリは間違いなくここでの制限リソースです。

4

10 に答える 10

16

ダブル(64ビット)およびフロート(32ビット)よりも10進数(128ビット)を使用することのポイントは、通常、サイズとは関係ありません。それは基地と関係があります。doubleとfloatは浮動小数点型ですが、decimalは浮動小数点型です。これにより、float/doubleでは不可能な0.1のような数値を正確に表すことができます。

64ビットの10進型を使用できなかったという概念的な理由はありません。多くの場合、それで十分です。ただし、そのような型が登場するか、自分で作成するまでは、「より短い」を使用しないでください。 "(およびバイナリ浮動小数点)財務計算用のfloat/doubleのタイプ。もしそうなら、あなたはトラブルを求めています。

10進数に変換したり、10進数から変換したりすることができ、それでも浮動小数点型であるストレージ型を作成することを提案している場合、計算ができなくても、それは潜在的に良い考えのように思えます。ただし、正確に表現できない10進値を変換するように求められた場合は、どうすればよいかを考えるときは、十分に注意する必要があります。正直なところ、そのようなタイプを見たいと思います。うーん...

(他の回答が示しているように、これを行う前に、メモリを占有しているのは数字であることを確認します。ただし、これを行う必要がない場合は、推測的に余分な複雑さを導入する意味はほとんどありません。)

于 2009-05-28T16:49:48.580 に答える
5

64ビット浮動小数点は財務データの精度を維持できません。スペースの問題ではなく、データ型が使用する記数法の問題です。doubleはbase-2を使用し、decimalはbase-10であり、base-2は1000ビットの精度であっても正確なbase-10の10進数を表すことはできません。

私を信じないの?これを実行します:

double d = 0.0;
for (int i = 0; i < 100; i++)
    d += 0.1;
Console.WriteLine(d);

> 9.99999999999998

10を底とする計算が必要な場合は、10進数タイプが必要です。

(編集:くそー、ジョン・スキートに再び殴られた...)

10進数のタイプが実際にボトルネックである場合は、10進数のドルの代わりに、長いペニー(または1/8セントまたは単位が何であれ)を使用できます。

于 2009-05-28T16:57:09.407 に答える
3

プロファイラーを使用して、どのオブジェクトが大量のメモリを消費しているかを確認する必要があります。あなたの小数オブジェクトが原因であるなら、私はそうだと思います。そうでなければ、あなたはただ推測をしているだけです。プロファイラーが確実に教えてくれます。

于 2009-05-28T16:33:40.923 に答える
3

パフォーマンスへの影響を気にしないのであれば、数値を64ビットで格納し、計算のために10進型にキャストし、結果を64ビットにキャストすることは完全に合理的です。

私が働く場所ではこのレベルの精度が必要なので、これがまさにここで行うことです。キャストを行うことで2桁の速度ヒットを取得しますが、浮動小数点演算の大きなエラーについて心配する必要はありません。キャストがないと、数値の範囲と実行される計算のタイプによっては、計算が非常に不正確になる可能性があります。

浮動小数点演算の詳細と、エラーが計算に忍び寄る理由については、 http://docs.sun.com/source/806-3568/ncg_goldberg.htmlの「すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと」を参照してください。

于 2009-05-28T16:49:15.820 に答える
2

64ビット浮動小数点が本当に必要な精度を表すのに十分である場合、これは完全に正気のようです。あなたが言うように、超高精度の小数は、複数の操作にわたる累積エラーを最小限に抑えるために純粋に使用されることがよくあります。

于 2009-05-28T16:33:04.747 に答える
2

他のほとんどの投稿ですでに指摘されているように、128ビットの10進数表現と64ビットの浮動小数点表現の間の変換は、常に精度を維持する変換ではありません。

ただし、金融株の価格を扱っている場合は、小数(ドルの小数)ではなく、int(ペニーの数)として表すことを検討できます。すべての財務計算を1セント硬貨で実行し、要求された場合にのみ小数として外部に公開します。

別のアプローチは、ストレージタイプを「圧縮」するのではなく、システムのアルゴリズム効率を改善することです。本当に一度にすべてのデータがメモリに必要ですか?どういうわけかそれを仮想化できますか?

そうでない場合は、管理しているデータの量を考慮して、冗長性を減らす方法でデータを整理することを検討することをお勧めします。たとえば、すべての株が過去に過去の価格を持っているわけではありません(一部の企業は過去に十分に存在していません)。したがって、データを、各株式の表形式の構造としてではなく、日(または年)ごとの株価の辞書として整理します。データがどのように利用可能であり、それを使用して計算を実行する方法によっては、他の選択肢がある場合があります。

于 2009-05-28T17:51:33.010 に答える
0

数値解析を行って、(128ビットを保持する)方法がばかげているか、単に怠惰であるか、または本当に必要かどうかを確認する必要があります。

于 2009-05-28T16:35:11.433 に答える
0

「メモリを追加するだけ」は受け入れられる答えですか?

これらの表現間で値を移動するという提案されたアプローチを適切にコーディングおよびテストするには、どのくらいのコストがかかりますか。そのコストを、アプリが64ビットプロセスとして実行されているマシンにメモリを追加することと比較してください。

于 2009-05-28T16:56:15.150 に答える
0

MSDNの10進数から:浮動小数点型と10進数型の間に暗黙の変換はありません。したがって、これら2つのタイプを変換するには、キャストを使用する必要があります。

使用している場合はキャストが必要なようです。

そうは言っても、浮動小数点で通貨を表現する問題に関して、ここにいる他のほとんどの人々が何について提起しているのかを理解することは非常に重要です。

システムに使用できる64ビットBCD(Binary Coded Decimal)実装の作成/検索を検討する方法があります。

于 2009-05-28T16:58:40.653 に答える
0

同じdoubleを10進数に変換し、次にbyte []に​​変換してから、圧縮すると約2分の1のスペースしか必要ありません(これをいくつかの圧縮ライブラリでテストしました:デフォルトのBlosc、lz4、シャッフルありまたはなしのzlib、シャッフル10進数が最適です)。

最近のCPUは不足しているため、1つのオプションは、圧縮された小数をメモリまたはディスクに保存することです。ここでいくつかのプレゼンテーションを参照してください:http://blosc.org/docs/

于 2015-01-13T21:18:05.840 に答える