in reply to Re: Round down to '.5' or '.0'
in thread Round down to '.5' or '.0'

The best part is that *2 and /2 are lossless operations on floats.

>perl -le"$,=' '; $x=.1; print map /(.)(.{11})(.*)/, unpack 'B*', reve +rse pack 'd', $x/=2 for 1..5;" 0 01111111010 1001100110011001100110011001100110011001100110011010 0 01111111001 1001100110011001100110011001100110011001100110011010 0 01111111000 1001100110011001100110011001100110011001100110011010 0 01111110111 1001100110011001100110011001100110011001100110011010 0 01111110110 1001100110011001100110011001100110011001100110011010 - ----------- ---------------------------------------------------- S Exponent Mantissa

Precision already loss is not recuperated, of course.

my $n; $n += 0.1 for 1..10; # $n = 0.1 * 10 = 1 ...ish my $r = int($n*2)/2; print("round($n) = $r\n"); # round(1) = 0.5 print("cause it's really doing\n"); # cause it's really doing printf("round(%.16e)\n", $n); # round(9.9999999999999989e-001)

Replies are listed 'Best First'.
Re^3: Round down to '.5' or '.0'
by gamache (Friar) on Oct 24, 2007 at 18:55 UTC
    I was wondering whether mult/div by powers of 2 would be translated to add/sub on the binary exponent... I'm not sure your example just showed me, but I trust you. :)

      Added examples to my earlier post for you.

      A reply falls below the community's threshold of quality. You may see it by logging in.
Re^3: Round down to '.5' or '.0'
by oha (Friar) on Oct 25, 2007 at 09:41 UTC
    You can't be sure. i remember i saw a base16 floating point representation. in this case *2 and /2 are lossy.

    i prefer to say that everything is at risk of being lossy with floats.

    Oha