This is the mail archive of the newlib@sourceware.org mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: double precision calculations in single precision code


Hi.

Thanks to all of you for answers. Without --enable-newlib-hw-fp it looks much better.

BTW: Jeff, if you are fixing documents, maybe you can also add a note to FAQ (from where I got that switch in first place).

Regards.
Branko

On 10/24/2012 06:39 PM, Jeff Johnston wrote:
On 10/24/2012 12:09 PM, marco atzeri wrote:
On 10/24/2012 1:30 PM, Branko Drevenšek wrote:
Hi.

We have Newlib ported to our architecture. One of configurations that we
support is hardware single precision and soft-float double precision.


I have noticed unexpected double precision soft-float function calls in
simple code like x = sinf(y), where both x and y are single precision.

I have noticed that Newlib sinef function (libm/mathfp/sf_sine.c)
contains lines like:
   /* Calculate the exponent. */
   if (y < 0.0)
     N = (int) (y * ONE_OVER_PI - 0.5);
   else
     N = (int) (y * ONE_OVER_PI + 0.5);

While y * ONE_OVER_PI gets calculated in single precision, that +- 0.5
causes the result of multiplication being converted to double and then
addition is done in double using soft-float. For our case this has big
performance penalty and also requires double soft-float functions to be
linked in, causing binary to grow.

Is 0.5 (instead of 0.5f) used by purpose or is that just wrong (and
needs fixing)? Where did those math. functions originate from?


I bet from the double version, that use exactly the same lines and they are likely in that form from the begin in 98. On CVS there is no change from inital import in 2000..


These functions were an experiment from a Red Hat intern for running on a system with floating-point math instructions. The algorithms chosen for some of the functions don't provide close to adequate accuracy for the large range of input possibilities and in the end, they didn't show any real performance improvements in testing.


Consider the experiment a failure. I long ago said I was going to remove them but I thought somebody might be interested in further experimentation and possibly fixing the algorithms. I will add a README in the directory, comment out the configuration option, and also add an explanation in the top-level README so nobody else wastes their time.

-- Jeff J.


 > Best regards,
 > Branko Drevensek





Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]