4

大きな float (プリミティブ) 配列があり、配列内のすべての要素が満たされているわけではありません。特定の要素を EMPTY としてマークするにはどうすればよいですか。これはいくつかの特別なシンボルによって実現できることは理解していますが、それでも標準的な方法を知りたいです。特殊なシンボルを使用している場合でも、実際のデータ項目が特殊なシンボルの値である状況をどのように処理しますか? 要するに、私の質問は、Java のプリミティブ型配列に NULL 機能を実装する方法です。

PS - Float オブジェクトを使用しない理由は、高いメモリと速度のパフォーマンスを実現するためです。

ありがとう

4

6 に答える 6

5

を使用できますがFloat.NaN、有効な値はこれまでありません。

NaN1 つは別の NaN と決して等しくないことに注意してくださいNaN

float a = Float.NaN;
if( a != a ) {
    System.out.println("wat?");
}

ただし、人が読むことを意図したコードでは、Float.isNaNメソッドを使用する必要があります。

于 2012-11-28T16:59:51.507 に答える
3

Float.NaN を使用できますか?

public class FloatArray {
    public static void main(String[] args) {
        float[] data = new float[10];
        data[5] = Float.NaN;
        for (float f : data){
            if (Float.isNaN(f)){
                System.out.println("No Valve");
            } else {
                System.out.println(f);
            }
        }
    }
}

次に、有効である可能性がある -1 のようなSentianl Valueを使用するリスクはなく、Float#isNaN(f) を使用してテストできます。

于 2012-11-28T17:00:43.737 に答える
1

1 つのオプションは、 のような巨大な値を使用することですFloat.MAX_VALUE

もう 1 つは、 の配列ではFloatなくの配列を実際に持つことです。floatこれにより、値を持つことができますnull

于 2012-11-28T16:59:09.943 に答える
1

Float.NaNこれには(not-a-number)を使用する傾向があります。

他とは異なりFloat.MAX_VALUE、配列で計算を行っているときにそれらを特別にチェックする必要はありません。NaN は NaN のままですが、MAX_VALUEその他は条件付きロジックを使用して処理する必要がある場合があります。

心に留めておくべき唯一の落とし穴は、NaN は、それ自体を含め、何とも同等ではないということです。

于 2012-11-28T17:00:33.080 に答える
0

通常のフロート、無限大、NaN、および空マークを float[] に含める方法があります。Float にはバイナリ表現があり (IEEE-754 を参照)、Float.floatToIntBits(float) で確認できます。NaN の「標準的な」(Float API を参照) バイナリ表現は 0x7fc00000 です。興味深いのは、NaN には多くのバイナリ表現があり、それらはすべて有効です。たとえば、0x7ff00000 も NaN です。これを試して

    int nan1 = 0x7ff00000;
    int nan2 = 0x7fc00000;
    float f1 = Float.intBitsToFloat(nan1);
    float f2 = Float.intBitsToFloat(nan2);
    System.out.println(Float.isNaN(f1));
    System.out.println(Float.isNaN(f2));

f1 と f2 の両方が NaN であることがわかります。

したがって、0x7ff00000 などの任意の非正規 NaN を空のマークとして使用できます。float を配列に書き込むときは、NaN が正規の形式に変換されることを確認してください。例えば

    f = (f != f) ? f = Float.NaN : f;

f != f は、float が NaN かどうかをテストする最速の方法であることに注意してください。

float が空のマークかどうかを確認するには

    isEmptyMark = f != f && Float.floatToRawIntBits(f) == 0x7ff00000;
于 2012-11-28T17:38:37.183 に答える
-1

これは、プリミティブの主な問題の 1 つです。値の範囲が、null意味のある表現ができないようなものであること。
に行くFloatか、特定の範囲の値とその意味を定義する必要があることをお勧めします。
例: ドメイン内で意味のある数字でない場合-1.0は、それを使用して を表すことができますnull
ただし、プリミティブではなくオブジェクトに切り替えることを強くお勧めします。

Float オブジェクトを使用していない理由は、高いメモリと速度のパフォーマンスを実現するためです。

非常に重い数のクランチ ボクシング/オートボクシングを行っていない限り、パフォーマンスの問題は発生しません。
いつものように、測定を行い、実際にパフォーマンスの問題があることがわかった場合はFloat、推定値を使用することをやめることができます.
最適化を早めすぎない

于 2012-11-28T16:59:18.443 に答える