the limit here is encased in LDBL_DIG
"Number of significant digits in a" long double "floating point number."
(because ksh uses long double for floating point arith)

if a chunk of long double arith code, C, ksh or otherwise arrives at a
comparison of two numbers from two different routes and demands significance
beyond LDBL_DIG (or possibly less than LDBL_DIG if there is enough roundoff 
error)
the the comparison will fail in the roundoff noise

in the example posted the roundoff error was well into the area beyond LDBL_DIG

so rather than cataloging implementations of math functions that could vary from
compiler to compiler on the same machine it would be much easier to code with
LDBL_DIG in mind

there are two other other mechanisms recently added to C:

a common area for roundoff error is in string <=> long double conversion
interpreters are especially hit in this area
coding with hex floating point notation for constants helps here
the constant syntax is 0x...p... and the corresponding printf format is %a
this is implemented in ast (and thus ksh)

there is also a decimal floating point api
we have some of the details from Roland Mainz
this is not implemented yet

On Fri, 8 Feb 2013 09:35:46 +0100 Lionel Cons wrote:
> Forwarding Icarus's comment.

> What we're facing here seems that different implementations of a libm
> function may result different results at the last digits, right? Is
> there a function to test how accurate the libm functions are, and is
> there a libm function which tests for equality in a specified
> precision?

> Lionel

> ---------- Forwarded message ----------
> From: Icarus Sparry <[email protected]>
> Date: 31 January 2013 05:29
> Subject: Re: [ast-users] Floating point oddities with pow()? Accuracy problem?
> To: Lionel Cons <[email protected]>

> pow(x, y) is typically implemented as exp(y * ln(x))

> On Jan 30, 2013 8:24 PM, "Lionel Cons" <[email protected]> wrote:
> >
> > On 29 January 2013 10:50, Lionel Cons <[email protected]> wrote:
> > > Can someone explain why the the examples below yield a difference? IMO
> > > pow() should deliver the same result as a x*x*x*... sequence. Or not?
> > >
> > > ksh -c 'float x y ; ((x=y=.1 , y=pow(y,4.) , x=x*x*x*x)) ; printf
> > > "%30.30f\n" x-y'
> > > -0.000000000000000000000006617444
> > > ksh -c 'float x y ; ((x=y=.1 , y=pow(y,6.) , x=x*x*x*x*x*x)) ; printf
> > > "%30.30f\n" x-y'
> > > -0.000000000000000000000000103397
> > > ksh -c 'float x y ; ((x=y=.1 , y=pow(y,8.) , x=x*x*x*x*x*x*x*x)) ;
> > > printf "%30.30f\n" x-y'
> > > -0.000000000000000000000000001615
> > >
> > > Platform is Suse 12.1 on AMD64.
> >
> > The difference between pow() and manual multiplication (example below)
> > revolves around certain values. Does that ring a bell?
> >
> > ksh -c 'float x y i ; for ((i=-5 ; i < 5 ; i=i+.1)) ; do ((x=y=.1*i ,
> > y=pow(y,8) , x=x*x*x*x*x*x*x*x)) ; printf "%30.30f\n" x-y ; done'
> > 0.000000000000000000000000000000
> > 0.000000000000000000000000000000
> > -0.000000000000000000000211758236
> > -0.000000000000000000000423516473
> > 0.000000000000000000000211758236
> > 0.000000000000000000000105879118
> > 0.000000000000000000000105879118
> > -0.000000000000000000000105879118
> > -0.000000000000000000000211758236
> > 0.000000000000000000000000000000
> > 0.000000000000000000000000000000
> > -0.000000000000000000000052939559
> > 0.000000000000000000000000000000
> > 0.000000000000000000000052939559
> > 0.000000000000000000000000000000
> > 0.000000000000000000000013234889
> > 0.000000000000000000000013234889
> > 0.000000000000000000000013234889
> > -0.000000000000000000000019852334
> > 0.000000000000000000000006617444
> > 0.000000000000000000000006617444
> > 0.000000000000000000000003308722
> > 0.000000000000000000000006617444
> > 0.000000000000000000000006617444
> > 0.000000000000000000000000000000
> > 0.000000000000000000000000000000
> > 0.000000000000000000000000827180
> > 0.000000000000000000000000000000
> > 0.000000000000000000000000000000
> > 0.000000000000000000000000620385
> > -0.000000000000000000000000206795
> > 0.000000000000000000000000000000
> > -0.000000000000000000000000206795
> > 0.000000000000000000000000000000
> > 0.000000000000000000000000000000
> > -0.000000000000000000000000051698
> > -0.000000000000000000000000012924
> > -0.000000000000000000000000006462
> > -0.000000000000000000000000006462
> > 0.000000000000000000000000000000
> > -0.000000000000000000000000000807
> > 0.000000000000000000000000000000
> > 0.000000000000000000000000000000
> > 0.000000000000000000000000000000
> > 0.000000000000000000000000000012
> > -0.000000000000000000000000000003
> > 0.000000000000000000000000000000
> > 0.000000000000000000000000000000
> > -0.000000000000000000000000000000
> > 0.000000000000000000000000000000
> > 0.000000000000000000000000000000
> > -0.000000000000000000000000000000
> > 0.000000000000000000000000000000
> > 0.000000000000000000000000000000
> > 0.000000000000000000000000000000
> > -0.000000000000000000000000000003
> > -0.000000000000000000000000000012
> > 0.000000000000000000000000000151
> > 0.000000000000000000000000000000
> > 0.000000000000000000000000000000
> > -0.000000000000000000000000000807
> > 0.000000000000000000000000001615
> > 0.000000000000000000000000006462
> > 0.000000000000000000000000012924
> > -0.000000000000000000000000012924
> > -0.000000000000000000000000025849
> > -0.000000000000000000000000051698
> > 0.000000000000000000000000000000
> > 0.000000000000000000000000103397
> > 0.000000000000000000000000103397
> > -0.000000000000000000000000413590
> > -0.000000000000000000000000413590
> > 0.000000000000000000000000000000
> > 0.000000000000000000000000000000
> > 0.000000000000000000000000000000
> > 0.000000000000000000000000000000
> > 0.000000000000000000000000000000
> > -0.000000000000000000000001654361
> > 0.000000000000000000000003308722
> > 0.000000000000000000000006617444
> > 0.000000000000000000000000000000
> > 0.000000000000000000000006617444
> > 0.000000000000000000000000000000
> > 0.000000000000000000000013234889
> > -0.000000000000000000000026469779
> > -0.000000000000000000000026469779
> > 0.000000000000000000000000000000
> > -0.000000000000000000000026469779
> > 0.000000000000000000000052939559
> > 0.000000000000000000000052939559
> > 0.000000000000000000000000000000
> > 0.000000000000000000000052939559
> > -0.000000000000000000000052939559
> > -0.000000000000000000000105879118
> > -0.000000000000000000000317637355
> > 0.000000000000000000000000000000
> > -0.000000000000000000000211758236
> > 0.000000000000000000000000000000
> > 0.000000000000000000000000000000
> > 0.000000000000000000000423516473
> > 0.000000000000000000000000000000
> >
> > Lionel
> > _______________________________________________
> > ast-users mailing list
> > [email protected]
> > http://lists.research.att.com/mailman/listinfo/ast-users

> -- 
> Lionel
> _______________________________________________
> ast-users mailing list
> [email protected]
> http://lists.research.att.com/mailman/listinfo/ast-users

_______________________________________________
ast-developers mailing list
[email protected]
http://lists.research.att.com/mailman/listinfo/ast-developers

Reply via email to