[fpc-pascal] Re: interested in building a library for functions?

Angel Montesinos montesin at uv.es
Sun Feb 27 21:25:53 CET 2011


El 26/02/2011 16:27, Marco van de Voort escribió:

> I never really started it, but one of the things I noticed is that the CPU
> instructions for certain goniometric functions don't always accept the full
> domain. How have you dealt with that in your code generation (or am I wrong,
> it is over 7 years ago that I made this)

Yes, the range  of argument is -2^63 to 2^63. I follow a suggestion of 
INTEL: first apply a   mod pi  or  mod 2*pi call for the argument 
(there is an instruction for this, FPREM), and then apply cos, sin or 
sincos. This should guarantees better performance, but for greater 
arguments the FPREM becomes simply innacurate and useless: thus it 
only serves as a dodge for the exception that would throw the FPU.

>> But in my
>> approach, instead of computing the cosine, it is computed the sincos
>> pair by using the x87 instruction of AMD or Intel. The two values are
>> used directly for computing the first and second derivatives: thus at
>> most _one_ call to an expensive FPU instruction.
>
> I don't fully understand this. In my approach I calculate d(cos(x))/dx =
> -sin(x) and then  d(-sin(x)/dx = -cos(x)  and only then use one floating
> -  point instruction to calculate the cosinus.


My rationale is that in serious mathematics, most time it is useless 
to compute the derivatives without computing also the value of the 
function. Thus, the call of sincos in a RPN step will give the 
function value and, by a further multiplication and sign change, that 
of its derivative. Also, for other expensive functions, the derivative 
is a simple function of the function value. For instance, tan' = 1 + 
tan^2. So, once computed tan (the function), we obtain easily also the 
derivative.

Also, if with your approach you must compute the derivative of the 
function
    x * cos(x),
you will compute
   cos(x)- x*sin(x).
And for the second derivative
   -sin(x) - sin(x) - x* cos(x),
because the computation of simplifications is an enormous task: 
therefore you will call two ot three expensive trig functions. My 
approach will compute only sincos once.

Another thing that is easy in my approach is to call from the object 
code any external function given in software: I use this for computing 
functions given by integrals (though this with much less precision).

> Or do you mean for stuff like Taylor where each term is a further
> differentation?

No, I have seen this in your library, but I don'use Taylor.


-- 
montesin at uv dot es





More information about the fpc-pascal mailing list