2 ms·
That has more to do with decimal <-> binary conversion than arithmetic/comparison. Using hex literals makes it clearer 0x1.999999999999ap-4 ("0.1") +
by zokier 7mo ago
That has more to do with decimal <-> binary conversion than arithmetic/comparison. Using hex literals makes it clearer
0x1.999999999999ap-4 ("0.1")
+0x1.999999999999ap-4 ("0.1")
---------------------
=0x3.3333333333334p-4 ("0.2")
+0x1.999999999999ap-4 ("0.1")
---------------------
=0x4.cccccccccccf0p-4 ("0.30000000000000004")
!=0x4.cccccccccccccp-4 ("0.3")
- jacquesm 7mo agoAbsolutely nobody will think this is 'clearer', this is a leaky abstraction and personally I think that the OP is right and == in combination with floating point constants should be limited to '0' and that's it.
- pdpi 7mo agoWe all know that 1/3 + 1/3 + 1/3 = 1, but 0.33 + 0.33 + 0.33 = 0.99. We're sufficiently used to decimal to know that 1/3 doesn't have a finite decimal representation. Decimal 1/10 doesn't have a finite binary representation, for the exact same reason that 1/3 doesn't have one in decimal — 3 is co-prime with 10, and 5 is co-prime with 2. The only leaky abstraction here is our bias towards decimal. (Fun fact: "base 10" is meaningless, because every base calls itself base 10)
- 1718627440 7mo ago> Fun fact: "base 10" is meaningless, because every base calls itself base 10 Maybe we should name the bases by the largest digit they have, so that we are using base 9 most of the time.
- brandmeyer 7mo agoRepeating the exercise with something that is exactly representable in floating point like 1/8 instead of 1/10 highlights the difference.