# error_demo1.py3 all floating point 64 bits on modern computer def add(v, ans): # should force store sum = v + ans return sum def main(): v = [0.0 for i in range(3)] ans = 0.0 print("error_demo1.py3 1.0e16*((1.0+1.2e-16)-1.0)") print("only about 16 digits accuracy, power of 10 not exact") v[0] = 1.0 # same as 1.0 double constant into float memory v[1] = 1.2e-16 v[2] = -1.0 for i in range(3): ans = ans + v[i] # should be kept in register ans = 1.0e16 * ans print("ans=", ans) print(" ") print("force store, break optimization, no difference here") ans = 0.0 ans = add(v[0], ans) ans = add(v[1], ans) ans = add(v[2], ans) ans = 1.0e16 * ans print("ans=", ans) print(" ") print("expression with double ans=", 1.0e10*((1.0+1.0e-16)-1.0)) print(" ") print("error_demo1.py3 (1.0+1.0e-16)+1.0 too small") v[1] = 1.0e-16 ans = 0.0 for i in range(3): ans = ans + v[i] ans = 1.0e10 * ans print("ans=", ans) print(" ") print("force store, break optimization, no difference here") ans = 0.0 ans = add(v[0], ans) ans = add(v[1], ans) ans = add(v[2], ans) ans = 1.0e16 * ans print("ans=", ans) if __name__ == '__main__': main() # end error_demo.py3