I hadn't seen Roland's reply when posting this
he gives a much clearer picture of the C mechanisms

On Fri, 8 Feb 2013 10:04:47 -0500 Glenn Fowler wrote:
> 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

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

Reply via email to