From: jzakiya Date: 2009-12-23T11:10:16+09:00 Subject: Trig value errors Hardware: 32-bit Intel P4 cpu 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.