浮動小数点数 (Java double) がたくさんありますが、そのほとんどは 1 に非常に近く、より大きな計算の一部としてそれらを乗算する必要があります。私はこれをたくさんする必要があります。
問題は、Java の double では次のような数値に問題がないことです。
0.0000000000000000000000000000000001 (1.0E-34)
次のようなものを表すことはできません。
1.0000000000000000000000000000000001
この結果、私は急速に精度を失います (制限は、Java の double では約 1.000000000000001 のようです)。
たとえば、1.0001 は 0.0001 として格納されますが、問題は、それらを再度乗算するには 1 を加算する必要があり、この時点で精度が失われることです。
これに対処するには、BigDecimals を使用して計算 (BigDecimal に変換し、1.0 を加算してから乗算) を実行し、その後 double に変換することができますが、これがパフォーマンスに与える影響について深刻な懸念があります。
BigDecimal を使用しないでこれを行う方法を誰でも見ることができますか?
明確にするために編集: これは、勾配降下最適化アルゴリズムを採用する大規模な共同フィルター用です。多くの場合、共同フィルターは非常に小さな数値 (商品の広告をクリックする確率など、1000 分の 1 または 10000 分の 1 など) を処理するため、精度が問題になります。
コラボレーティブ フィルターは、それ以上ではないにしても、数千万のデータ ポイントでトレーニングする必要があるため、速度が問題になります。