जब आप एक साथ युगल जोड़ते हैं तो सटीकता रखने के लिए आपको काहन सारांश का उपयोग करने की आवश्यकता होती है , यह एक कैरी रजिस्टर रखने के बराबर सॉफ्टवेयर है।
यह अधिकांश मूल्यों के लिए ठीक है, लेकिन यदि आप अतिप्रवाह कर रहे हैं तो आप IEEE 754 डबल-परिशुद्धता की सीमा मार रहे हैं जो कि बारे में होगा । इस बिंदु पर आपको एक नए प्रतिनिधित्व की आवश्यकता है। आप इसके अलावा समय के साथ एक अतिप्रवाह का पता लगा सकते हैं और मूल्यांकन करने के लिए बड़े से बड़े भागीदारों का भी पता लगा सकते हैं । इस बिंदु पर आप प्रतिपादक को शिफ्ट करने और इस बदलाव पर नज़र रखते हुए एक डबल की व्याख्या को संशोधित कर सकते हैं।ई709.783doubleMax - sumSoFar < valueToAdd
exponent > 709.783
अधिकांश भाग के लिए यह आपके घातांक ऑफसेट दृष्टिकोण के समान है, लेकिन इस संस्करण को इसे बेस 2 में रखा गया है और सबसे बड़े घातांक को खोजने के लिए प्रारंभिक खोज की आवश्यकता नहीं है। इसलिए ।v a l u e × 2s h i f t
#!/usr/bin/env python
from math import exp, log, ceil
doubleMAX = (1.0 + (1.0 - (2 ** -52))) * (2 ** (2 ** 10 - 1))
def KahanSumExp(expvalues):
expvalues.sort() # gives precision improvement in certain cases
shift = 0
esum = 0.0
carry = 0.0
for exponent in expvalues:
if exponent - shift * log(2) > 709.783:
n = ceil((exponent - shift * log(2) - 709.783)/log(2))
shift += n
carry /= 2*n
esum /= 2*n
elif exponent - shift * log(2) < -708.396:
n = floor((exponent - shift * log(2) - -708.396)/log(2))
shift += n
carry *= 2*n
esum *= 2*n
exponent -= shift * log(2)
value = exp(exponent) - carry
if doubleMAX - esum < value:
shift += 1
esum /= 2
value /= 2
tmp = esum + value
carry = (tmp - esum) - value
esum = tmp
return esum, shift
values = [10, 37, 34, 0.1, 0.0004, 34, 37.1, 37.2, 36.9, 709, 710, 711]
value, shift = KahanSumExp(values)
print "{0} x 2^{1}".format(value, shift)