0

[-1,1]に属する値がいくつかあります。精度はそれほど必要ありませんが、これらの値がたくさん必要になります。今では私はハードウェアの専門家になっているので、解決策は簡単に思い浮かびました。固定小数点演算を使用することです。2 ^(-7)=0.0078125の精度が得られる8ビットのJavaバイト型を使用してメモリを節約したいと考えています。これを実行し、切り捨て/オーバー(アンダー)フローの問題を処理する方法はすでにありますか?

また、これらの値も多くの計算に使用されるため、計算のオーバーヘッドをできるだけ避けたいと思います。

ありがとう

4

2 に答える 2

1

これを実行し、切り捨て/オーバー(アンダー)フローの問題を処理する方法はすでにありますか?

これらの問題にどのように対処したいかによって異なります。あなたが提案しているように見えるのは、byte値をスケーリングされた値として扱うことです。現在、Javaにはスケーリングされた数値のサポートが組み込まれていないため、算術演算を慎重に行う必要があります...切り捨て、アンダーフロー、およびスケール調整を自分で処理します。

気をつければ…できます。


しかし、それは価値がありますか?

最初に考慮すべきことは、フィールドまたはローカル変数がorフィールドbyteとまったく同じスペースを取ることです...32ビット。(または、64ビットマシンではさらに多くの可能性があります。)intfloat

実際、バイトが実際にのメンバーである場合にのみ、メモリを節約しますbyte[]

次に、スペース削減を達成するための努力が本当に価値があるかどうかを自問する必要があります。これらのスケーリングされたバイト値がいくつあるかを測定しましたか?アプリケーションの他のメモリ使用量と比較しましたか?これらのスケーリングされたバイト値のうち、いくつを表す必要があるかさえ知っていますか?

また、これらの値も多くの計算に使用されるため、計算のオーバーヘッドをできるだけ避けたいと思います。

問題があります。スケーリングされた値を使用した算術演算では、特にオーバーフロー/アンダーフローを検出する場合は、追加の命令が必要になります。これにより、アプリケーションの速度が低下する傾向があります。


floatオーバーフローとアンダーフローの問題をすべて自動的に処理するアプリケーションを使用して実装する傾向があります。次に、実際のデータでアプリケーションを実行して、アプリケーションの速度と使用するメモリの量を確認します。

  • 両方とも許容できる場合は、そのままにしておきます。
  • メモリ使用量が多すぎるか、速度が遅すぎる場合は、これを修正する方法を検討してください。スケーリングされた数値アプローチを試すことにした場合:
    • floatおよびを使用してキー計算を実装するbyte
    • スケーリングされた算術コードを修正するためのテスト、および
    • 両方のバージョンを慎重にベンチマークして、違いを定量化します。

結果がどうなるかは予測できません。しかし、多くの人が、最適化する必要のないコードを最適化するのに時間を浪費していると言えます。その間違いをしないでください-時期尚早に最適化しないでください。

于 2013-02-17T13:49:57.010 に答える
-2

私はあなたの問題をこのように理解しています。次のコードは、最終変数によってもパフォーマンスを提供します。

最終バイトx=-1; 最終バイトy=1;

バイトデータ型では、少し注意する必要があることを忘れないでください。

バイトb1=x * y; エラーが発生します。次のようにします。

バイトb1=(バイト)(x * y);

于 2013-02-17T13:40:13.357 に答える