Skip to content

total_seconds: Fix precision problem #8

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 26, 2021

Conversation

jepler
Copy link
Contributor

@jepler jepler commented Mar 22, 2021

Since CircuitPython floats have very small precision, the "total_seconds" method was not very useful for large timedeltas.

Instead of always returning a float, use pure-integer arithmetic (and return an int) if either:

  • the length of time is big (1<<21 is 2097152 seconds or about 24 days)
  • the number of microseconds is zero

Otherwise, for small values with nonzero microseconds, use floating-point math.

The cut-off point was chosen because in CircuitPython float arithmetic, 2097151.0+0.5 is different from 2097151.0, but 2097152.0+0.5 and 2097152.0 are the same float.

Since CircuitPython floats have very small precision, the "total_seconds"
method was not very useful for large timedeltas.

Instead of always returning a float, use pure-integer arithmetic (and
return an int) if either:
 * the length of time is big (1<<21 is 2097152 seconds or about 24 days)
 * the number of microseconds is zero

Otherwise, for small values with nonzero microseconds, use floating-point
math.

The cut-off point was chosen because in CircuitPython float arithmetic,
2097151.0+0.5 is different from 2097151.0, but 2097152.0+0.5 and
2097152.0 are *the same float*.
@jepler jepler force-pushed the jepler-integer-total_seconds branch from b1f9f0a to 13f9332 Compare March 22, 2021 20:57
@tannewt tannewt requested a review from brentru March 22, 2021 22:44
Copy link
Member

@brentru brentru left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm - thanks jepler!

@brentru brentru merged commit 3bc22c5 into master Mar 26, 2021
@brentru brentru deleted the jepler-integer-total_seconds branch March 26, 2021 15:01
adafruit-adabot added a commit to adafruit/Adafruit_CircuitPython_Bundle that referenced this pull request Apr 7, 2021
Updating https://github.com/adafruit/Adafruit_CircuitPython_CircuitPlayground to 4.3.3 from 4.3.2:
  > Merge pull request adafruit/Adafruit_CircuitPython_CircuitPlayground#104 from kattni/main-fix
  > "Increase duplicate code check threshold "

Updating https://github.com/adafruit/Adafruit_CircuitPython_DHT to 3.6.0 from 3.5.8:
  > Merge pull request adafruit/Adafruit_CircuitPython_DHT#68 from yeyeto2788/master
  > "Increase duplicate code check threshold "

Updating https://github.com/adafruit/Adafruit_CircuitPython_FocalTouch to 1.2.7 from 1.2.6:
  > Merge pull request adafruit/Adafruit_CircuitPython_FocalTouch#20 from adafruit/linting
  > "Increase duplicate code check threshold "

Updating https://github.com/adafruit/Adafruit_CircuitPython_RockBlock to 1.3.3 from 1.3.2:
  > Merge pull request adafruit/Adafruit_CircuitPython_RockBlock#21 from adafruit/linting
  > "Increase duplicate code check threshold "

Updating https://github.com/adafruit/Adafruit_CircuitPython_Wiznet5k to 1.9.3 from 1.9.2:
  > Merge pull request adafruit/Adafruit_CircuitPython_Wiznet5k#32 from adafruit/linting
  > "Increase duplicate code check threshold "

Updating https://github.com/adafruit/Adafruit_CircuitPython_AdafruitIO to 5.2.4 from 5.2.3:
  > Merge pull request adafruit/Adafruit_CircuitPython_AdafruitIO#68 from brentru/validate-feed-keys-used
  > "Increase duplicate code check threshold "

Updating https://github.com/adafruit/Adafruit_CircuitPython_AVRprog to 1.3.7 from 1.3.6:
  > Merge pull request adafruit/Adafruit_CircuitPython_AVRprog#21 from adafruit/linting
  > "Increase duplicate code check threshold "

Updating https://github.com/adafruit/Adafruit_CircuitPython_BitmapSaver to 1.1.6 from 1.1.5:
  > Merge pull request adafruit/Adafruit_CircuitPython_BitmapSaver#14 from kmatch98/patch-2
  > "Increase duplicate code check threshold "
  > Merge pull request adafruit/Adafruit_CircuitPython_BitmapSaver#17 from FoamyGuy/pylintrc

Updating https://github.com/adafruit/Adafruit_CircuitPython_BLE_Radio to 0.3.5 from 0.3.4:
  > Merge pull request adafruit/Adafruit_CircuitPython_BLE_Radio#15 from adafruit/linting
  > "Increase duplicate code check threshold "

Updating https://github.com/adafruit/Adafruit_CircuitPython_BoardTest to 1.2.6 from 1.2.5:
  > Merge pull request adafruit/Adafruit_CircuitPython_BoardTest#15 from adafruit/linting
  > "Increase duplicate code check threshold "

Updating https://github.com/adafruit/Adafruit_CircuitPython_datetime to 1.1.3 from 1.1.2:
  > Merge pull request adafruit/Adafruit_CircuitPython_datetime#8 from adafruit/jepler-integer-total_seconds
  > "Increase duplicate code check threshold "

Updating https://github.com/adafruit/Adafruit_CircuitPython_Display_Text to 2.18.3 from 2.18.2:
  > Merge pull request adafruit/Adafruit_CircuitPython_Display_Text#150 from jposada202020/advanced_example
  > Merge pull request adafruit/Adafruit_CircuitPython_Display_Text#149 from jposada202020/optimizing_getting_font_info

Updating https://github.com/adafruit/Adafruit_CircuitPython_RGBLED to 1.1.5 from 1.1.4:
  > Merge pull request adafruit/Adafruit_CircuitPython_RGBLED#15 from adafruit/dherrada-patch-1
  > "Increase duplicate code check threshold "

Updating https://github.com/adafruit/Adafruit_CircuitPython_RSA to 1.2.4 from 1.2.3:
  > Merge pull request adafruit/Adafruit_CircuitPython_RSA#18 from adafruit/linting
  > "Increase duplicate code check threshold "
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants