Hi Alan: Looking at the PDL code, 'acos' is defined for both 'float' PDLs and 'double' PDLs based on the C library 'acos' function. It seems like the single precision 'acos' is being called instead of the double precision one. The value you get from 'p acos(-1.)' is the single precision value:
perldl> p acos(float(-1)) 3.14159274101257 perldl> p acos(double(-1)) 3.14159265358979 Even odder: On my machine, I get this: perldl> p acos(-1) 3.14159265358979 perldl> p acos(-1.) 3.14159274101257 (!) It seems that if you put a decimal point in, the value is interpreted as a 'float', not a 'double'. PDL folks: Any idea why -1 is interpreted as 'double' and '-1.' is interpreted as 'float'?? Regards, Doug [email protected] Software Engineer IV UCAR - COSMIC, Tel. (303) 497-2611 On Thu, 11 Dec 2008, Doug Hunt wrote: > Alan, Andrew: Thanks for finding/fixing these problems. > >> You were correct it was a problem with the Perl math library. The main >> trouble I had in finding this was figuring out how to print out individual >> elements of a pdl array. For future reference, this worked: >> >> for (my $i = 0; $i < int($windings)*int($steps)+1; $i++) { >> printf("%f,%f,%f,%f\n", $phi->slice($i)->slice('(0)'), >> $phiw->slice($i)->slice('(0)'), $xcoord->slice($i)->slice('(0)'), >> $ycoord->slice($i)->slice('(0)')); >> } > > You can also do this: > > wcols $phi; > > --That will print out all 20,000 elements of $phi in a single column. Or > this: > > print $phi->mslice([0,99]); > > That will print out the first 100 elements of $phi. > >> >> The result showed the errors gradually increased with phi which lead me to >> the scale error in the PI value used in dphi. >> >> Here is the crux of that scale error. >> perldl> p 4*atan2(1,1) >> 3.14159265358979 >> perldl> p acos(-1.) >> 3.14159274101257 >> >> The first is the correct value of PI to the printed precision, the second >> is wrong in the 7th place. In contrast, the C math library (and every >> other language binding we have) calculates PI to full precision >> without problems for acos(-1.) >> >> Doug, will you please do the honors and make the appropriate bug report? >> This is ugly, and I am amazed such a perl math library error is still with >> us after all these years. > > It turns out that 'acos' is not a *perl* function, but it is a *PDL* > function. So, I have more control over this--I'll look into it. Good > catch! > > --Doug > > ------------------------------------------------------------------------------ > SF.Net email is Sponsored by MIX09, March 18-20, 2009 in Las Vegas, Nevada. > The future of the web can't happen without you. Join us at MIX09 to help > pave the way to the Next Web now. Learn more and register at > http://ad.doubleclick.net/clk;208669438;13503038;i?http://2009.visitmix.com/ > _______________________________________________ > Plplot-devel mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/plplot-devel > _______________________________________________ Perldl mailing list [email protected] http://mailman.jach.hawaii.edu/mailman/listinfo/perldl
