import sys
import csv
import numpy as np
outfile = 'sum_error.csv'
h = 0.01
n = 101
iprintstep = 10
[ドキュメント]
def getintarg(argv, iarg, defval=None):
try:
return int(argv[iarg])
except Exception:
return defval
[ドキュメント]
def getfloatarg(argv, iarg, defval=None):
try:
return float(argv[iarg])
except Exception:
return defval
[ドキュメント]
def main():
global h, n, iprintstep
argv = sys.argv
narg = len(argv)
if narg <= 2:
print("")
print("Usage: python sum_error.py h n iPrintStep")
print(" Summing up h for n times with different precision floating point types.")
print(" Output every iPrintStep steps")
print("")
return
h = getfloatarg(argv, 1, h)
n = getintarg(argv, 2, n)
iprintstep = getintarg(argv, 3, iprintstep)
h16 = np.array([h], dtype=np.float16)
sum16 = np.array([0.0], dtype=np.float16)
h32 = np.array([h], dtype=np.float32)
sum32 = np.array([0.0], dtype=np.float32)
h64 = np.array([h], dtype=np.float64)
sum64 = np.array([0.0], dtype=np.float64)
ex = np.array([0.0], dtype=np.float64)
err16 = np.array([0.0], dtype=np.float64)
err32 = np.array([0.0], dtype=np.float64)
err64 = np.array([0.0], dtype=np.float64)
print("")
print(
"Summing up {} for {} times with "
"different precision floating point types".format(h, n)
)
print("Write to [{}]".format(outfile))
with open(outfile, 'w', newline='') as f:
fout = csv.writer(f, lineterminator='\n')
fout.writerow([
'exact', 'float16', 'float32', 'float64',
'error(float16)', 'error(float32)', 'error(float64)'
])
print("")
print(f"{'exact':^5}:\t{'sum16 (error)':^28}\t{'sum32 (error)':^28}\t{'sum64 (error)':^28}")
for i in range(n):
ex[0] = (i + 1) * h
sum16[0] += h16[0]
err16[0] = ex[0] - sum16[0]
sum32[0] += h32[0]
err32[0] = ex[0] - sum32[0]
sum64[0] += h64[0]
err64[0] = ex[0] - sum64[0]
fout.writerow([
ex[0], sum16[0], sum32[0], sum64[0],
err16[0], err32[0], err64[0]
])
if i % iprintstep == 0:
print(f"{ex[0]:<0.4f}: ", end='')
print(f"{sum16[0]:<0.18f} ({err16[0]:<+9.2e}) ", end='')
print(f"{sum32[0]:<0.18f} ({err32[0]:<+9.2e}) ", end='')
print(f"{sum64[0]:<0.18f} ({err64[0]:<+9.2e}) ", end='')
print("")
print("")
if __name__ == "__main__":
main()