[tz] localtime.c issue
Paul_Koning at Dell.com
Paul_Koning at Dell.com
Mon Jul 8 21:28:30 UTC 2013
On Jul 8, 2013, at 5:19 PM, Alan Barrett wrote:
> On Mon, 08 Jul 2013, Arthur David Olson wrote:
> [localtime.c]
>> --- 1514,1521 ----
>> }
>> {
>> register int_fast32_t seconds;
>>
>> ! seconds = tdays * SECSPERDAY + 0.5;
>> tdays = seconds / SECSPERDAY;
>> rem += seconds - tdays * SECSPERDAY;
>> }
>
> If time_t is an integer type, then that will multiply tdays * SECSPERDAY using time_t arithmetic, convert to double to add 0.5, then convert to int_fast32_t for the assignment. The conversion to and from double may lose precision, if double has less than 32 bits of mantissa precision (but that's unlikely).
>
> Perhaps this will work without either a compiler warning or potential loss of precision:
>
> seconds = tdays * SECSPERDAY + (time_t)0.5;
>
> --apb (Alan Barrett)
I rather doubt it. Casting 0.5 to an integer type (as time_t is) ends up adding 0 or 1, but not 0.5.
How about (tdays * SECSPERDAY * 2 + 1) / 2; ?
paul
More information about the tz
mailing list