0

一見すると、私の質問は少し奇妙に思えるかもしれません。double を float 値にキャストすることは、私が望むものではありません。それをキャストすると、IEEE-754 で定義された規則に関していくらかの精度が失われ、浮動小数点数の範囲への double 値の実際のマッピングを達成できないためです。それは役に立たない。次の式は機能しますが、大量の入力がある場合は非常にコストがかかります。

float mappedVal = (float)((val * MAX_FLOAT_VALUE + 1) / MAX_DOUBLE_VALUE);

まったく同じ計算を高速化するために、ある種のビット演算を介して結果を上記の「mappedVal」に近づけることはできますか?

4

2 に答える 2

0

一部の double 値は float の範囲をはるかに超えているため、何を達成しようとしているのかわかりません。

ただし、float には大きすぎる値を失うリスクを冒しても構わない場合は、次の方法を試してください。

float f = new Double(val).floatValue();

編集: float へのキャストとまったく同じです。:)

于 2013-03-15T09:43:55.343 に答える
0

これは、同じ上位 32 ビットを持つ float に倍精度値をマップします。

float mappedVal = Float.intBitsToFloat((int)(Double.doubleToLongBits(val)>>32));

この演算の算術解釈は少し複雑ですが、指数の一部が仮数にマッピングされます...

于 2013-03-15T16:25:35.843 に答える