On Sun, 15 Oct 2006 20:03:18 +1000, Ben Finney wrote:

"Paddy" <pa*******@netscape.netwrites:

>Ben Finney wrote:
Your calculator is probably doing rounding without you asking for

it.

Python refuses to guess what you want, and gives you the

information available.

I don't think Python should take too much credit here.

I don't understand what you could mean by this. Credit for "giv[ing]

you the information available"? That's exactly what it's doing.

>Floating point calcuations are subject to rounding. Sometimes it

shows.

And Python is showing it, rather than hiding it. It certainly isn't

doing any rounding unless asked to do so.

Python simply exposes whatever the C maths library does. The C maths

library is almost certainly doing some rounding: floats have only a finite

precision, which generally means the designer of the math library has two

choices: just truncate (chop) the calculation, or carry extra guard digits

(or bits) and round down. Most systems these days use guard digits, as

that is more accurate than truncating to a fixed precision.

If you mean that Python isn't doing *extra* rounding, above and beyond

what the C library is doing, you're correct. But rounding is happening.

This is a useful resource:

"What every computer scientist should know about floating-point

arithmetic"

http://docs.sun.com/source/806-3568/ncg_goldberg.html
To go back to the Original Poster's problem, he pointed out that his "16

bit calculator" gave a more accurate (but less precise) answer for

sin(pi), namely 0, instead of the more precise (but less accurate)

1.2246063538223773e-016 that Python reported. That just goes to show that,

sometimes, extra precision in floating point maths is a bad thing -- a

less precise library would actually have given a more correct answer.

This isn't strictly a Python question, but if there is anybody out there

who knows what the C library is doing, I'd appreciate an answer: since

sine is periodic, doesn't it make sense to reduce the argument modulo pi

before calculating the sine? Something like this:

def _sin(x):

x = x % math.pi

return math.sin(x)

Yes, you lose precision for large values of x because of the modulo, and

because math.pi isn't precisely pi, but that's got to be better than

losing precision for moderate values of x, surely? Have I missed something?

--

Steve.