1

私はHadoopで作業しており、オブジェクトを生のネットワーク順序バイト配列としてソートするためのコンパレーターを提供する必要があります。これは私にとって整数で行うのは簡単です-私は各バイトを順番に比較するだけです。フロートについてもこれを行う必要があります。Javaで使用されるfloatのIEEE754形式は、各バイトを符号付き8ビット値として比較するだけでソートできると思いますが、参照は見つかりません。

誰かがこれを確認または反論できますか?

編集:表現はIEEE75432ビット浮動小数点です。私は実際に(より大きな)バイトバッファとそのバッファ内のオフセットと長さを持っています。これをフロートに簡単に変換できるユーティリティメソッドがすでにいくつかあるので、この質問は議論の余地があると思います。誰かが答えを知っているかどうか私はまだ興味があります。

4

4 に答える 4

3

これはほとんど機能します:

int bits = Float.floatToIntBits(x);
bits ^= (bits >> 31) & Integer.MAX_VALUE;

ここで、負のフロートのビットは0〜30で反転しています(符号ビットを保持しながら、元の符号/大きさの表現とは逆の順序が必要なため)。

警告:

  • NaNは順序付けに含まれます(NaNが含まれる場合は、結果が未定義であると見なすのが最適です)。
  • +0は-0より大きいと比較されるようになりました(組み込みの関係演算子はそれらを等しいと見なします)。

ただし、非正規化数や無限大など、他のすべての値に対して機能します。

于 2011-05-28T16:39:57.997 に答える
3

正の浮動小数点数は、2 の補数の整数として表示されるビット表現と同じ順序になります。負の浮動小数点数はそうではありません。

たとえば、-2.0f のビット表現は で0xc0000000、-1.0f は です0xbf800000。表現で比較を使用しようとすると、-2.0f > -1.0f になりますが、これは正しくありません。

NaN の問題もあります (すべての浮動小数点データに対して順不同で比較しますが、表現はそうではありません) が、気にする必要はないかもしれません。

于 2009-11-24T00:42:56.680 に答える
1

Float.toIntBits(float) を使用して整数を比較します。

編集:これは、正の無限大を含む正の数に対してのみ機能しますが、NaN には機能しません。負の数の場合、順序を逆にする必要があります。もちろん、正の数は負の数よりも大きくなります。

于 2009-11-24T07:05:18.987 に答える
0

ネットワーク経由でデータを送信する場合は、int を送信するときと float を送信するときに、何らかの形式の意味表現が必要です。これはマシンに依存しない情報であるため、データ型の幅もどこかで定義するか、仕様によって事前定義する必要があります (つまり、32 ビットまたは 64 ビットの float)。したがって、実際にすべきことは、バイトを適切なデータ型に蓄積してから、自然言語のデータ型を使用して比較を行うことです。

答えを本当に正確にするには、送信コードと受信コードを見て、装飾されたI / Oストリームなどを介してプリミティブをオートボクシングしているかどうかを確認する必要があります。より良い回答を得るには、より詳細な情報を提供してください。

于 2009-11-24T00:02:48.430 に答える