import math import random import numpy as np def produce_list_and_its_sum(semilength=100, valmax=1000.): valmax=abs(valmax) valmin=-valmax ret = np.zeros(2* semilength +1) for i in range(semilength): x = random.uniform(valmin, valmax) ret[2*i], ret[2*i +1] = x, -x y = random.uniform(valmin, valmax) ret[2*semilength] = y np.random.shuffle(ret) return ret, y def produce_list_and_its_sum2(semilength=100, valmax=1000.): length=2*semilength valmax=abs(valmax) ret = np.zeros(2* semilength +1) totret = tot = random.uniform(0, valmax) for i in range(length): x = random.uniform(0, tot) ret[i] = x tot -= x np.random.shuffle(ret) return ret, totret def do_my_sum(list_): ret = 0.0 for real in list_: ret += real return ret # return math.fsum(list_) # return sum(list_) def compare_sums(size=100, valmax=1000., print_liste=False): (list_, result) = produce_list_and_its_sum2(size//2, valmax) if print_liste: print(list_) max_ = list_.max() min_ = list_.min() realsize = len(list_) sum1 = do_my_sum(list_) list_.sort() if print_liste: print(list_) sum2 = do_my_sum(list_) list_[:] = list_[::-1] if print_liste: print(list_) sum3 = do_my_sum(list_) err1 = abs(result - sum1) err2 = abs(result - sum2) err3 = abs(result - sum3) fmt="""Taille de la liste : {} Max el : {}, min el : {} Erreurs dans les sommes : {}, {}, {} """ print(fmt.format(realsize, max_, min_, err1, err2, err3)) return (err1, err2, err3) if __name__ == '__main__': errors = np.zeros((3,100)) for i in range(100): e1, e2, e3 = compare_sums(50, 1000.0) errors[0,i] = e1 errors[1,i] = e2 errors[2,i] = e3 avg1=np.average(errors[0]) avg2=np.average(errors[1]) avg3=np.average(errors[2]) print(avg1, avg2, avg3) ### Remarques # Si on utilise des nombres negatifs et postifs alors mieux # ne pas trie le tableu # Si on utilise des nombres positifs, # mieux trier le tableau en ordre ascendant # Si on utilise math.fsum, les resultats sont egaux