blob: 01b7839527dbcbe796307850037a3324b6394f1d (
plain) (
tree)
|
|
define sin(x) {
auto b, s, r, a, q, i
if (x < 0)
return (-sin(-x))
b = ibase
ibase = A
s = scale
scale = 1.1 * s + 2
a = atan(1)
scale = 0
q = (x / a + 2) / 4
x -= 4 * q * a
if (q % 2)
x = -x
scale = s + 2
r = a = x
q = -x * x
for (i = 3; a; i += 2) {
a *= q / (i * (i - 1))
r += a
}
scale = s
ibase = b
return (r / 1)
}
define cos(x){
auto b, s
b = ibase
ibase = A
s = scale
scale *= 1.2
x = sin(2 * atan(1) + x)
scale = s
ibase = b
return (x / 1)
}
define atan(x){
auto b, s, r, n, a, m, t, f, i, u
b = ibase
ibase = A
n = 1
if (x < 0) {
n = -1
x = -x
}
if (scale < 65) {
if (x == 1) {
r = .7853981633974483096156608458198757210492923498437764552437361480/n
ibase = b
return (r)
}
if (x == .2) {
r = .1973955598498807583700497651947902934475851037878521015176889402/n
ibase = b
return (r)
}
}
s = scale
if (x > .2) {
scale += 5
a = atan(.2)
}
scale = s + 3
while (x > .2) {
m++
x = (x - .2) / (1 + .2 * x)
}
r = u = x
f = -x * x
t = 1
for(i = 3; t; i += 2) {
u *= f
t = u / i
r += t
}
scale = s
ibase = b
return ((m * a + r) / n)
}
|