पर रूपांतरण द्वारा लंबे समय तक अग्रणी शून्य ढूंढना Long.numberOfLeadingZeros(long i) विधि ढूंढने से पहले, मैं युगल के लिए लंबे समय तक कास्टिंग कर रहा था और Math.getExponent(double d) का उपयोग कर रहा था। विचार लंबे समय के दोहरे प्रतिनिधित्व को खोजने के लिए था, उच्चतम सेट बिट प्राप्त करने के लिए एक्सपोनेंट का उपयोग करें, और अग्रणी शून्यों की संख्या प्राप्त करने के लिए इसे 64 से घटाएं।जावा - डबल
यह ज्यादातर 1. द्वारा बंद काम किया, लेकिन कभी-कभी था निम्नलिखित के लिए लूप समस्या को हाइलाइट करने के लिए इस्तेमाल किया गया था:
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
...
देशांतर सभी बिट्स सेट 1^52 से ऊपर 1 से बंद हैं। As this post explains, 52-बिट मंटिसा में 53+ महत्वपूर्ण बिट्स के संग्रहण के कारण परिशुद्धता का नुकसान होता है। हालांकि, मैं समझने के लिए संघर्ष कर रहा हूं कि एक्सपोनेंट क्यों प्रभावित होता है।
जबकि मैं अब इस विधि का उपयोग नहीं कर रहा हूं, मैं अभी भी उत्सुक हूं: क्यों और किस परिस्थितियों में लंबे समय तक अग्रणी शून्य खोजने की विधि विफल होती है?
यह सही समझ में आता है। अपनी पोस्ट पढ़ने के बाद, मैंने अपने 11 कम से कम महत्वपूर्ण बिट्स को ड्रॉप करने के लिए 2^53 - 1 से अधिक मूल्यों को मजबूर किया: 'value & = 0xFFFFFFFFFFFFF700L;' एक डबल से रूपांतरण से पहले, अनावश्यक गोल करना। मैं भी भूल गया कि मंटिसा में अतिरिक्त अंतर्निहित बिट है। विस्तृत उत्तर के लिए धन्यवाद! –