aboutsummaryrefslogblamecommitdiff
path: root/bc_funcs/trig.bc
blob: 9a4fcb3f50ae0bdb9b8f177ba0c259c97e773a73 (plain) (tree)
1
               




























                                      

 
               











                                
                








                                         
 



















                                                                                               
 


                        
                      






                                           
                                







                                
 
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 += 1
		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)
}