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
