That's not what I said -- of course they are not subnormal as double
floats, but they are (in a sense, for want of a better term) "subnormal"
when using a fixed point decimal representation, such as
sprintf("%.17f", ...).

A more relevant form of the test should be something like

while true
  x = rand()
  if parsefloat(@sprintf("%.16e", x)) != x
    println(x)
    break
  end
end

which should be an infinite loop if the implementation is correct (only
16, since there is a digit before the decimal dot).

Best,

Tamas

On Wed, Nov 05 2014, Stefan Karpinski <[email protected]> wrote:

> No, these aren't subnormal values, although they are small. Using %.16e
> does print them all accurately though, so that's a bit misleading. By
> "hang" I meant that it doesn't return quickly, not that it won't ever
> return.
>
> On Wed, Nov 5, 2014 at 2:27 PM, Tamas Papp <[email protected]> wrote:
>
>> 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 <[email protected]> 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 <
>> > [email protected]> 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
>> >>
>>
>>

Reply via email to