On Jun 3, 2008, at 2:48 PM, Duncan Murdoch wrote:
On 6/3/2008 11:43 AM, Patrick Carr wrote:
On 6/3/08, Duncan Murdoch <[EMAIL PROTECTED]> wrote:
because signif(0.90, digits=2) == 0.9. Those two objects are
identical.
My text above that is poorly worded. They're identical internally,
yes. But in terms of the number of significant digits, 0.9 and 0.90
are different. And that matters when the number is printed, say as an
annotation on a graph. Passing it through sprintf() or format() later
requires you to specify the number of digits after the decimal, which
is different than the number of significant digits, and requires case
testing for numbers of different orders of magnitude.
The original complainant (and I) expected this behavior from
signif(),
not merely rounding. As I said before, I wrote my own workaround so
this is somewhat academic, but I don't think we're alone.
As far as I know, rounding is fine in Windows:
> round(1:10 + 0.5)
[1] 2 2 4 4 6 6 8 8 10 10
It might not be the rounding, then. (windows xp sp3)
> signif(12345,digits=4)
[1] 12340
> signif(0.12345,digits=4)
[1] 0.1235
It's easy to make mistakes in this, but a little outside-of-R
experimentation suggests those are the right answers. The number
12345 is exactly representable, so it is exactly half-way between
12340 and 12350, so 12340 is the right answer by the unbiased round-
to-even rule. The number 0.12345 is not exactly representable, but
(I think) it is represented by something slightly closer to 0.1235
than to 0.1234. So it looks as though Windows gets it right.
OS X (10.5.2/intel) does not have that problem.
Which would seem to imply OS X gets it wrong.
This has nothing to do with OS X, you get that same answer on pretty
much all other platforms (Intel/Linux, MIPS/IRIX, Sparc/Sun, ...).
Windows is the only one delivering the incorrect result here.
Both are supposed to be using the 64 bit floating point standard,
so they should both give the same answer:
Should, yes, but Windows doesn't. In fact 10000.0 is exactly
representable and so is 1234.5 which is the correct result that all
except Windows get. I don't have a Windows box handy, so I can't tell
why - but if you go through fprec this is what you get on the
platforms I tested (log10 may vary slightly but that's irrelevant here):
x = 0.123450000000000004174439
l10 = -0.908508905732048899217546, e10 = 4
pow10 = 10000.000000000000000000000000
x*pow10 = 1234.500000000000000000000000
Cheers,
Simon
but the actual arithmetic is being done by run-time libraries that
are outside our control to a large extent, and it looks as though
the one on the Mac is less accurate than the one on Windows.
But (on both windows and OS X):
> signif(12345.12345,digits=10)
[1] 12345.12
This is a different problem. The number is correctly computed as
12345.12345 (or at least a representable number quite close to
that), and then the default display rounds it some more. Set
options(digits=19) to see it in its full glory.
Duncan Murdoch
______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel