2

私はコンサルタントとして Oracle RPAS という製品に取り組んでおり、アプリケーションは C++ を使用して開発されています。Oracle RPAS では、カスタム開発された Java プログラムに対して JNI 呼び出しを行い、データを処理できます。Oracle RPAS for Real に格納されるデータは常に Double (8 バイト) であり、Java でも同じデータを使用できます。残念ながら、Oracle RPAS は、データがデータベースに Double として格納されていても、double やその他の計算を比較するためのイプシロンとしてハードコードされた値 0.0000000001 (1e-09) を使用しています。Java では、コードをこのハードコードされた値に合わせる方法を見つけることができません。同様の方法でデータセットを比較する必要があります。これらは数学演算です。主に実行する必要があるのは、 min(double x,double Y) 、 max(double x,double Y) round(double x*double Y)/ double Y) 、 ceil 、floor などです。

イプシロンがJavaでどのように機能するかを理解するのに助けが必要ですか? 開発に使用したJavaのバージョンは1.6

私は Java の専門家ではなく、Java でのコーディング経験があり、この問題に取り組むための出発点はどれでも役に立ちます。

4

2 に答える 2

0

イプシロンの全体的な考え方は、アプリケーション ロジックに基づいている必要があります。小数点第 3 位までの値が期待されるデータを扱う場合は、 のようなイプシロンを使用します0.0001。または、同様に、アプリケーションが 10 億 (1,000,000,000) までの数を処理することがわかっている場合、double はせいぜい小数点以下 5 ~ 6 桁 (有効数字 15 桁から小数点以下 10 桁を引く) まで正確であることがわかります。したがって、イプシロンとして 0.000001 を選択することは合理的です。

私の知る限り、Java は二重比較中に内部イプシロン処理を行いません。C/C++ を書いているときと同じように、明示的に行う必要があります。

もちろん、代わりに BigDecimal を検討することもできます。ただし、BigDecimal 演算を行う場合は、維持したい精度を定義する必要があります。これは、double のイプシロンと同様の理由で行われます。

于 2015-11-12T04:01:07.770 に答える