【表1-1】
from tkinter import *
import math
def initTk(Title):#Tkモジュール起動
    root=Tk();root.title(Title)
    return root
def initCanvas(root,W,H):#キャンパスの定義
    canvas=Canvas(root,width=W,height=H)
    canvas.pack()
    return canvas
def drawScale(canvas):#目盛り表示
    CL="#CCCCCC"; CL2="#777777";CL3="#000000"; V=1.0
    for i in range(1,12):#縦方向目盛り表示
        Y=i*20
        canvas.create_line(30,Y,430,Y,width=1,fill=CL)
        canvas.create_text(15,Y,text=("%3.1f" % V),
                           font=('Times',8),fill=CL3)
        V-=0.2
    V=0.0; dV=math.pi/10
    for i in range(22):#横方向目盛り表示
        X=i*20+30
        if i % 5==0:
            canvas.create_line(X,20,X,220,width=1,fill=CL2)
            canvas.create_text(X,230,text=("%4.2f" % V),
                               font=('Times',8),fill=CL3)
        else:
            canvas.create_line(X,20,X,220,width=1,fill=CL)
        V+=math.pi/10
    canvas.create_line(30,120,430,120,width=1,fill=CL2)
    canvas.create_rectangle(30,20,430,220,width=1,fill="", outline=CL2)
def drawV(Xb,Tb,Xa,Ta,CL):#値の描画
    X1=Tb*100/math.pi+30;Y1=120-Xb*100
    X2=Ta*100/math.pi+30;Y2=120-Xa*100
    canvas.create_line(X1,Y1,X2,Y2,width=3,fill=CL)
root=initTk("Numerical Analysis")
canvas=initCanvas(root,440,240)
canvas.pack(); drawScale(canvas)
THdeg=40 #角度(この値を変更して実行する)
TH=THdeg*math.pi/180 #度をラジアンに変更する
Tb=0.0; X1b=TH*math.cos(Tb);X2b=TH #シミュレーション開始
dt=math.pi/20; V=0
for i in range(80):
    Ta=Tb+dt; X1a=TH*math.cos(Ta)
    drawV(X1b,Tb,X1a,Ta,'red')  #近似値
    V=V-dt*math.sin(X2b);X2a=X2b+dt*V
    drawV(X2b,Tb,X2a,Ta,'blue') #シミュレーション値
    Tb=Ta; X1b=X1a; X2b=X2a 

【表1-2】
import math
V=1; X=-10; N=100; XX=X
for i in range(1,N):
    V+=XX; XX=XX*X/(i+1)
    print("%4d, %f" %(i,V))

【表1-5】
import math
def myExpM(X):
    XX = abs(X); K = int(XX); XX = XX - K # 整数分を差し引く
    E = 1.0; N = 1; AX = 1.0; LastE=2.0     # 初期設定
    while E!=LastE :   # Expのマクローリン展開の収束計算
        LastE = E; AX = AX*XX / N; E += AX
        N += 1
    A = 2.71828182845905   # 整数分の乗算処理
    while K > 0:
        if K & 1: E *= A   # 2進数該当桁が1のとき乗算
        K = int(K / 2); A *= A  # 回数を2で除し,乗算すべき値を2乗
    if X < 0 : E = 1/ E    # 元の値が負のとき逆数にする。
    return E

【表1-6】
def myExpM2(X):
    XX = abs(X); K = int(XX); XX = XX - K # 整数分を差し引く
    E = 1.0; N = 1; AX = 1.0; LastE=2.0     # 初期設定
    while E!=LastE :   # Expのマクローリン展開の収束計算
        LastE = E; AX = AX*XX / N; E += AX
        N += 1
    Alf = 0.523536028747135; P = Alf / (1 - Alf); PP = 1 + P # 補正用設定
    A1 = 2.71828182845904; A2 = 2.71828182845905  # 整数分の乗算処理
    while K > 0:
        if K & 1 : E *= (A1 + P * A2) / PP # 乗算の補正
        K = int(K / 2); A1 *= A1; A2 *=A2  # 乗ずる値を2乗する。  
    if X < 0 :E = 1 / E        # 元の値が負のとき逆数にする。
    return E

【表1-7】プログラムのみ
for X in range(-3,7):
    E1=myExpM(X); E2=myExpM2(X)
    print(X, E1, E2, math.log(E1),math.log(E2))

【表1-8】
import math
def myLog(X):
    N = 20  # Flog2は桁落ち対策用
    log2 = 0.693147180559945; Flog2 = 3.09417232E-16
    XX = abs(X)
    if XX < 0.0000000000001 :return -1E+308
    L = 0
    while XX >= 2:        # L * log2分を加算
        XX /= 2              # ここで桁落ちはないが
        L = (L+log2) + Flog2 # 減算のときと式を揃えるため
    while XX < 1:            # XX < 1 のとき差し引く
        XX *= 2;
        L = (L - log2) - Flog2  # 桁落ち対策
    XX -= 1; A = 0      #連分数展開
    for i in range(N,0,-1):
        A = i * XX / (2 + i * XX / (2 * i + 1 + A))
    return L + XX / (1 + A)
for i in range(1,101):#確認用メイン
    X=0.1*i; Y=myLog(X); Z=math.exp(Y)
    print("%4.1f, %10.6f, %4.1f, %10.4e" %(X,Y,Z,Z-X))

【表1-10】
import math
def mySqrt(X):
    XX = abs(X);
    if XX < 1E-16: return 0.0
    less1 = False
    if XX < 1: XX = 1/XX; less1 = True # 1より小さい時,逆数
    N=1; NN=1
    while N<XX: N+=1; NN=N*N # 平方がXXを超えない整数
    if abs(float(NN) - XX) < 1E-16: return float(N)
    N-=1; NN = N * N; DX = XX - float(NN)
    if abs(DX) < 1E-16: return float(N)
    DN = 2 * N; DM = DN / DX; Z=0 # 連分数の計算
    for i in range(30) : Z = 1 / (DM + 1 / (DN + Z))
    Z += N     # 元データが1より小さい時,逆数をとる
    if less1: return 1 / Z
    return Z
for i in range(100):#確認用メイン
    X=i*0.1; Y=mySqrt(X); Z=Y*Y
    print("%4.1f, %10.6f, %4.1f, %10.4e" % (X, Y,Y*Y,Z-X))