আপনি একসাথে ডাবল যুক্ত করার সময় যথাযথতা বজায় রাখার জন্য আপনাকে কাহান সামোমেশন ব্যবহার করতে হবে , এটি সফ্টওয়্যারটি একটি ক্যারি রেজিস্টার থাকার সমতুল্য।
এটা হল সবচেয়ে মানের জন্য জরিমানা, কিন্তু আপনি যদি ওভারফ্লো তারপর পাচ্ছেন আপনি সীমা আঘাত করছে আইইইই 754 ডাবল স্পষ্টতা যা সম্পর্কে হবে । এই মুহুর্তে আপনার একটি নতুন উপস্থাপনা দরকার। আপনি সংযোজন করার সময় অতিরিক্ত সময়ে একটি ওভারফ্লো শনাক্ত করতে পারেন এবং এটির দ্বারা মূল্যায়নের জন্য এক্সপোশনগুলিও সনাক্ত করতে পারেন । এই মুহুর্তে আপনি এক্সপোজনটি স্থানান্তরিত করে এবং এই শিফটের ট্র্যাক রেখে একটি ডাবলের ব্যাখ্যাটি সংশোধন করতে পারেন।e709.783doubleMax - sumSoFar < valueToAdd
exponent > 709.783
এটি বেশিরভাগ অংশের জন্য আপনার এক্সপোনেন্ট অফসেট পদ্ধতির অনুরূপ, তবে এই সংস্করণটি এটিকে বেস 2 এ রাখা হয় এবং বৃহত্তম সন্ধানকারীটিকে সন্ধানের জন্য প্রাথমিক অনুসন্ধানের প্রয়োজন হয় না। অত: পর ।value×2shift
#!/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)