in reply to Negative zero? There's gotta be a sprintf that undoes that, right?

alternatively...

my $sign = ""; if ($example < 0) { $example = -$example; $sign = "-"; } $tret = sprintf("rounded float: %s%7.5f", $sign, $example);
Note: Untested....

...roboticus

Update: I thought about it some more. It'll still have the same problem. If you were to use this approach, you'd also need an if statement that would clear the sign if the value is less than the smallest value represented as a nonzero number.

Clearly not worth the effort.

  • Comment on Re: Negative zero? There's gotta be a sprintf that undoes that, right?
  • Download Code

Replies are listed 'Best First'.
Re^2: Negative zero? There's gotta be a sprintf that undoes that, right?
by rgiskard (Hermit) on Dec 11, 2007 at 18:53 UTC

    I can see where you're going with this; pull out the sign and then do something based on the sign. But in all honesty, negative numbers are fine; unless it's negative zero, be it -0.0 or -0.00000000.
    An unsigned float would've nipped this problem in the bud.

      rgiskard:

      I had assumed that negatives were fine. I was just showing an alternative solution to the problem.

      ...roboticus

        Well, something is to be said for approaching a problem from different points of view and uncovering new truths. So I'll give it a try.

        The solution wasn't as smooth as I'd hope, apparently -0.0 == 0.

        my $sign = ""; my $number = -0.000001; my $example = sprintf("%.5f", $number); #$example = $number; #uncomment this, to remove the initial rounding print "A. Started with : $example \n"; if ($example < 0) { $example = -$example; $sign = "-"; print "B. Less than zero: changed to $example \n"; } print "C. the number is $example \n"; if ($example == 0 ) { print "D1. the number ($example) is equal to zero, removing the si +gn.\n"; $example *= -1; #(couldn't hurt, it's zero) print "D2. the number ($example) is equal to zero, removing the si +gn.\n"; $sign = ''; } print "E. proceeding to sprint $example with sign $sign .\n"; $tret = sprintf("rounded float: %s%7.5f : unrounded %7.5f", $sign, $ex +ample, $number); print "$tret \n";
        Output:
        A. Started with : -0.00000 
        C. the number is -0.00000 
        D1. the number (-0.00000) is equal to zero, removing the sign.
        D2. the number (0) is equal to zero, removing the sign.
        E. proceeding to sprint 0 with sign  .
        rounded float: 0.00000 : unrounded -0.00000