Replace rounding-error prone floating point code with robust integer code #36
+37
−16
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
When this package was uploaded to Debian we noticed test failures on i386.
Debian i386 uses the x87 floating point unit which is known to have slightly different floating point behavior from other architectures due to excess precision in it's floating point registers. However when I made the testsuite more thorough I found rounding errors on amd64 as well.
The problem is that sometimes when a decimal number is converted to floating point and multiplied by 1000 the result is slightly smaller than expected due to floating point rounding. When the resulting slightly smaller number is rounded towards zero in the conversion to integer the result is a number one smaller than expected.
My fix was to avoid floating point completely and implement the milliseconds parsing using purely slicing and integer math.