I think that you are just running floats which are "subnormal" in a fixed-point decimal representation: with "%.17f", they have (on average) a single 0 after the decimal dot, with "%.18f", they have two, etc. Printing them with %f but a fixed number of digits is not the right way, since you waste digits on these zeroes.
It should not hang at 21, except, of course, it will take more time to generate a float below approx 1e-5. David's issue is different, and essentially boils down to julia> bits(1/Inf) "0000000000000000000000000000000000000000000000000000000000000000" julia> bits(-1/Inf) "1000000000000000000000000000000000000000000000000000000000000000" which are equal when compared with == (which follows the IEEE standard) but not is(,) (which compares bits). Best, Tamas On Wed, Nov 05 2014, Stefan Karpinski <ste...@karpinski.org> wrote: > This code prints a random Float64 that requires more than 15 digits to > reconstruct: > > while true > x = rand() > if parsefloat(@sprintf("%.15f", x)) != x > println(x) > break > end > end > > > There are lots of them. What's more surprising is that if you replace 15 > with anything up to 20, it still returns really quickly – at 21 it hangs. > This implies that values requiring up to 20 digits to print "honestly" are > quite common. > > On Wed, Nov 5, 2014 at 1:53 PM, David van Leeuwen < > david.vanleeu...@gmail.com> wrote: > >> I couldn't resist this after my cholfact() revelation... >> >> On Wednesday, November 5, 2014 11:23:03 AM UTC+1, Stefan Karpinski wrote: >>> >>> Well, I'm not sure what the intention was, but this fact is true: for >>> floating-point values x and y of the same type, x == y is true if and only >>> if string(x) == string(y). >>> >>> >> julia> a = inv(eye(2)) >> >> 2x2 Array{Float64,2}: >> >> 1.0 -0.0 >> >> 0.0 1.0 >> >> julia> a[1,2] == a[2,1] >> >> true >> >> julia> string(a[1,2]) == string(a[2,1]) >> >> false >> (pardon the formatting, I don't seem to have a good handle on this in >> google groups) >> >> Cheers, >> >> ---david >>