J

#### jzakiya

The following examples below show what I consider

to be 'mathematical' errors (to distinguish from

'arithmetic' errors) for sin, cos, and tan.

The problem is that for cos(x)/sin(x), from the

mathematical perspective, and their requirements,

whatever value of x that causes sin/[cos] = -1/+1

REQUIRES cos/[sin] of x MUST BE ZERO - cos/[sin]=0

Ruby 1.9.1p243 output below

1)onedegree =2*PI/360 =>0.0241660973353061

2)cos onedgree =>0.999847695156391

3)sin onedgree =>0.0241637452361323

4)cos onedegree/1e05 =>0.999999999999971

5)sin onedegree/1e05 =>2.41660973353059e-07

6)cos onedegree/1e06 =>1.0

7)sin onedegree/1e06 =>2.41660973353061e-08

8)cos onedegree/1e07 =>1.0

9)sin onedegree/1e07 =>2.41660973353061e-09

10)cos 0 =>1.0

11)sin 0 =>0.0

12)cos PI/2 =>6.123023176911189e-17

13)sin PI/2 =>1.0

14)cos PI =>-1.0

15)sin PI => 1.22460635382238e-16

16)cos 3*PI/2 =>-1.83690953073357e-16

17)sin 3*PI/2 =>-1.0

18)cos 2*PI => 1.0

19)sin 2*PI =>-2.44921970764475e-16

Examples 4)-9) show that at some point for cos a

decision was made to fix (roundoff.truncation,?)

cos(of a very smal number) = 1.0, however,

the implementation doesn't make that (necessary)

decision to set the sin of that angle equal to 0.

In fact, I gave up after sin(onedegree/1e100) to

see if the answer would ever give the answer '0'.

10)-19) show the errors for cos/sin for angles

that correspond to the x/y axis as the angle traverses

the unit circle ccw from 0 - 2*PI. These errors also

affect the tan functions in the same manner.

It would greatly enhance the use of Ruby in scientific

and engineering domains if Ruby implemented the trig

functions so that MATH done with the trig functions

produce exact results for all angles on the axis.

The values in 12), 15), 16) and 19) are so small they

represent |delta angles| that would hardly be encountered

to represent real physical events, even in astrophysics,

or quantum mechanics. And if someone REALLY needed to calculate trig

values for angles that small they can

use Mathmematica, etc, or better SAGE (OSS symbolic

math program, done in Python: www.sagemath.org/).

These fixes should be fairly simple to implement by

putting the relevant checks on the inputs to the trig

functions to set the outputs to '0' for the values of

the angles = n*PI/2 for n = any integer, when needed.

It may be as simple as representing cos(x) = sin(x+PI/2)

or vice versa. Or even simpler, check the output of the

current functions and set to zero if the absolute value

is smaller than some real-life epsilon (1e-10 ?)

Just make the defaults give the correct results.

Yes, it's a little more work in the core.

Yes, it may make for slower functions, if anyone cares.

But...being able to do ACCURATE MATH creates benefits

that far supercede any hassles to write the core to do it.

I can see Ruby's use in academia, science, and engineering being more

accepting if it reduces unnecessary quirks with trig functions, so

people get what they expect when doing basic operations. It may even

impress people to see Ruby's concern for detail placed in such high

regard.

Finally, this violates the POLS for trigs, because, after

all, the whole point is to make the language make me happy, not the

other way around.