[Mono-devel-list] Re: [PATCH] Various DateTime fixes and tests
Steven Brown
swbrown at ucsd.edu
Wed Jun 9 23:07:22 EDT 2004
Atsushi Eno wrote:
> Hello,
>
>> What's the status of the DateTime patch and the regression tests?
>> They don't seem to be in the CVS yet; just checking to be sure they
>> don't slip through the cracks.
>
>
> Oh, sorry. I thought the patch was already in.
>
> Ok, I manually applied your fixes to the current DateTime.cs as the
> patch attacheed. However, FromOADate test (recently Sebastien added
> it) shows that this patch is incomplete. Well, that might be my
> manual patchy wrong, but can you try make run-test in corlib and
> check if it does not happen to your box?
>
> 9) MonoTests.System.DateTimeTest.FromOADate : Ticks-Min
> expected:<31242239136000000>
> but was:<31242239135999958>
(test line in question: AssertEquals ("Ticks-Min", 31242239136000000,
DateTime.FromOADate (-657434.999d).Ticks))
This isn't a bug in my patch, it's an artifact in FromOADate exposed by
removing the rounding to milliseconds in AddMilliseconds in my patch. I
say artifact rather than bug as it's not apparent from the MSDN pages
that FromOADate is supposed to do rounding, but it surely is in
Microsoft's implementation.
The problem is that IEEE floating point numbers are evil. :) As a
double, the -657434.999 argument is actually -657434.998999999952502...
Using bc, since it's arbitrary precision, we can tell what the error
would be just on the fractional part (of an hour) given to FromOADate alone:
((60 * 60) * 0.999) - ((60 * 60) * 0.998999999952502)
.000000170992800
If I've done my math right, that's 171 nanoseconds, or about 2 ticks.
As such, it'd be impossible for a proper implementation to arrive at
31242239136000000, which has zero in the ticks place, even if it was
perfectly accurate. Since Microsoft's does, it's probably rounding even
though the MSDN page doesn't seem to say anything about rounding.
Either that, or it's just a coincidence of compounded rounding error.
More information about the Mono-devel-list
mailing list