Baran to prove it lets ignore the hard parts so this approximation is amenable. Then we solve the simpler problem, then lets hope \(sin.f(1,234,567,890)\) is a reasonable approximation to \(1\).
angle.reduction.f <- function(x_val){# x_val=given angle
p_val = 3.14159265358979
p_half_val = p_val / 2
i = as.integer(x_val / p_half_val)
b_val = i - 4 * as.integer(i / 4) + 1
c_val = x_val
if (i != 0 & (b_val == 1 | b_val == 3)){
d_val = c_val / i
e_val = (p_half_val - d_val) # complement to 90°
a_val = (e_val * -i)
} else if (i != -1 & (b_val == 2 | b_val == 4)){
d_val = c_val / (i + 1)
e_val = (p_half_val - d_val) # complement to 90 degrees
a_val = e_val * (i + 1)
} else if (i == 0) {
a_val = c_val
} else if (i == -1) {
a_val = -c_val
}
return(list(a_val=a_val, b_val=b_val))
}
sin.f <- function(x_val){ # x_val=given angle
p_val = 3.14159265358979
eps_val = 10 ^ -30 # sqrt(.Machine$double.eps)
l=angle.reduction.f(x_val)
a_val=l$a_val
b_val=l$b_val
pi_qtr_val = p_val / 4
if (pi_qtr_val >= a_val){
e_val = a_val
f_val = e_val
g_val = e_val * e_val
for (i in seq(3, 1000, 2)){
j = i * (i - 1)
e_val = e_val * g_val
e_val = -e_val / j
f_val = f_val + e_val
if (abs(e_val) <= eps_val) {break}
}
c_val = f_val
} else {
d_val = pi_qtr_val * 2 - a_val
g_val = d_val
g_val = g_val * g_val
e_val = 1
f_val = e_val
for (i in seq(2, 1000, 2)){
j = i * (i - 1)
e_val = e_val * g_val
e_val = -e_val / j
f_val = f_val + e_val
if (abs(e_val) <= eps_val) {break}
}
c_val = f_val
}
if (!(b_val == 1 | b_val == 2)){c_val = -c_val}
if (abs(c_val) < eps_val){c_val = 0}
return(c_val)
}
options(digits = 15)
sin.f(1234567890) # 0.9866537
## [1] 0.986653719874146