3 ms·
Do you believe that the way the REPL prints a number is the way it's stored internally? If so, explaining this will be a fun exercise: $ python3 Python
by chowells 1y ago
Do you believe that the way the REPL prints a number is the way it's stored internally? If so, explaining this will be a fun exercise:
$ python3
Python 3.11.2 (main, Apr 28 2025, 14:11:48) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> a = 0.1
>>> a + a + a
0.30000000000000004
By way of explanation, the algorithm used to render a floating point number to text used in most languages these days is to find the shortest string representation that will parse back to an identical bit pattern. This has the direct effect of causing a REPL to print what you typed in. (Well, within certain ranges of "reasonable" inputs.) But this doesn't mean that the language stores what you typed in - just an approximation of it.
- anthk 1y agoOddly, tcl prints 0.30000000000000004 while jimtcl prints 0.3, while with 1/7 both crap out and round it to a simple 0. Edit: Now it does it fine after inputting floats: puts [ expr { 1.0/7.0 } ] Eforth on top of Subleq, a very small and dumb virtual machine: 1 f 7 f f/ f. 0.143 ok Still, using rationals where possible (and mod operations otherwise) gives a great 'precision', except for irrationals.
- nulld3v 1y ago:facepalm: my bad, I completely missed the more rational intepretation of OP's comment... I interpreted "directly representable" as "uniquely representable", all < 15 digit decimals are uniquely represented in fp64 so it is always safe to roundtrip between those decimals <-> f64, though indeed this guarantee is lost once you perform any math.