Long.numberOfLeadingZeros(long i)の方法を見つける前に、私はlongをdoubleにキャストし、Math.getExponent(double d)を使用していました。考え方は、longの二重表現を見つけ、指数を使って最高のセットビットを得、それを64から引いて先行ゼロの数を得ることでした。出力の重要な部分とJava - 長い二倍の変換で先行ゼロを見つける
for (int i = 0; i < 64; i++) {
double max = Long.MAX_VALUE >>> i;
double min = Long.MIN_VALUE >>> i;
double neg = -1L >>> i;
System.out.format("Max: %-5d Min: %-5d -1: %-5d%n", Math.getExponent(dmax),
Math.getExponent(dmin), Math.getExponent(dneg));
}
:
...
Max: 55 Min: 55 -1: 56
Max: 54 Min: 54 -1: 55
Max: 52 Min: 53 -1: 54
Max: 51 Min: 52 -1: 52
Max: 50 Min: 51 -1: 51
...
憧れる
この
は、ほとんどの問題を強調するために使用されたforループ、以下の1でオフ時折働いたが、でしたすべてのビットが2^52より上に1だけオフになっています。 As this post explains, 52ビットの仮数部に53+の有効ビットを格納するために精度が低下します。しかし、私は指数が影響を受ける理由を理解するのに苦労しています。私はもはやこのメソッドを使用していませんが、私はまだ不思議です:なぜ、どのような状況で、長い間に先行ゼロを見つけるこの方法は失敗しますか?
これは理にかなっています。投稿を読んだ後、私は2^53 - 1より大きい値を11の最下位ビットを '0xFFFFFFFFFFFFF700L;'で降下させました。ダブルに変換する前に、丸めを不要にします。私はまた、仮数に余分な暗黙のビットがあることを忘れてしまった。詳細な答えをありがとう! –