Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cosine in floating point

I am trying to implement the cosine and sine functions in floating point (but I have no floating point hardware).

Since my processor has no floating-point hardware, nor instructions, I have already implemented algorithms for floating point multiplication, division, addition, subtraction, and square root. So those are the tools I have available to me to implement cosine and sine.

I was considering using the CORDIC method, at this site However, I implemented division and square root using newton's method, so I was hoping to use the most efficient method.

Please don't tell me to just go look in a book or that "paper's exist", no kidding they exist. I am looking for names of well known algorithms that are known to be fast and efficient.

like image 296
Veridian Avatar asked Feb 13 '12 18:02

Veridian


People also ask

What is the importance of cosine?

The cosine function is a periodic function which is very important in trigonometry. The simplest way to understand the cosine function is to use the unit circle. For a given angle measure θ , draw a unit circle on the coordinate plane and draw the angle centered at the origin, with one side as the positive x -axis.

What is cosine function physics?

The cosine function (or cos function) in a triangle is the ratio of the adjacent side to that of the hypotenuse. The cosine function is one of the three main primary trigonometric functions and it is itself the complement of sine(co+sine).

How do you represent cosine?

In any right triangle, the cosine of an angle is the length of the adjacent side (A) divided by the length of the hypotenuse (H). In a formula, it is written simply as 'cos'. Often remembered as "CAH" - meaning Cosine is Adjacent over Hypotenuse.

What is COSF function?

The cos() and cosf() functions compute the cosine of x (measured in radians). A large magnitude argument may yield a result with little or no significance. The cosf() function is a single-precision version of cos().


2 Answers

First off, depending on your accuracy requirements, this can be considerably fussier than your earlier questions.

Now that you've been warned: you'll first want to reduce the argument modulo pi/2 (or 2pi, or pi, or pi/4) to get the input into a manageable range. This is the subtle part. For a nice discussion of the issues involved, download a copy of K.C. Ng's ARGUMENT REDUCTION FOR HUGE ARGUMENTS: Good to the Last Bit. (simple google search on the title will get you a pdf). It's very readable, and does a great job of describing why this is tricky.

After doing that, you only need to approximate the functions on a small range around zero, which is easily done via a polynomial approximation. A taylor series will work, though it is inefficient. A truncated chebyshev series is easy to compute and reasonably efficient; computing the minimax approximation is better still. This is the easy part.

I have implemented sine and cosine exactly as described, entirely in integer, in the past (sorry, no public sources). Using hand-tuned assembly, results in the neighborhood of 100 cycles are entirely reasonable on "typical" processors. I don't know what hardware you're dealing with (the performance will mostly be gated on how quickly your hardware can produce the high part of an integer multiply).

like image 75
Stephen Canon Avatar answered Oct 02 '22 17:10

Stephen Canon


For various levels of precision, you can find some good approximations here:

http://www.ganssle.com/approx.htm

With the added advantage that they are deterministic in runtime unlike the various "converging series" options which can vary wildly depending on the input value. This matters if you are doing anything real-time (games, motion control etc.)

like image 20
Martin Thompson Avatar answered Oct 02 '22 17:10

Martin Thompson