in reply to Re: number comparison with a twist
in thread number comparison with a twist

> Because $num2 is not a floating point

$num2 is a float with rounding error after already before the multiplication.

Just the string representation will ignore the rounding error hence eq will work here.

I that's reliable for all cases? I don't dare saying.

DB<4> $num2 ="19.90" DB<5> printf "%.20f", $num2*100 1989.99999999999980000000 DB<6> p 1990 == $num2 *100 DB<7> p 1990 eq $num2 *100 1 DB<8> say ">". $num2 *100 ."<" >1990< DB<9>

Cheers Rolf
(addicted to the Perl Programming Language :)
Wikisyntax for the Monastery

Replies are listed 'Best First'.
Re^3: number comparison with a twist
by Veltro (Hermit) on Mar 02, 2020 at 15:38 UTC
    $num2 is a float with rounding error after the multiplication.

    I am not so sure about that.

    print "1989.9999999999998" + 0 ; # 1990

    The 'target form' is decimal string.

    From perlnumber Target form: If the source number can be represented in the target form, that representation is used.

    Also: When a numeric value is passed as an argument to such an operator, it will be converted to the format understood by the operator.. My assumption is that this counts for  + - / * etc applied to the decimal string and eventually also for eq.

      The print is showing the string representation only, where rounding errors are smoothed away in a DWIM way.

      Try printf "%.20f",$var to see the rounding errors pertaining after +0.

      Cheers Rolf
      (addicted to the Perl Programming Language :)
      Wikisyntax for the Monastery

        I understand that the internal representation is (probably) floating point. However that is still an assumption of what the internal representation "decimal string" actually is. My point is that using the eq operator targets "decimal string" which has a lower precision (for DWIM reasons?), so you are absolutely right that that method smoothes the rounding errors from floats away

        printf "%.20f",$var

        This targeted floating point with high precision.

        This is what I (presumably) hope to target with the eq:

        printf "%.11f", $num2*100 ; # 1990.00000000000

        I'm not sure if $.11f now shows the exact correct number of decimals (which should be 15 I believe), but as far as I can see this solves OP's problem and that is why I suggested it. Just using eq is in my opinion fine for this particular use case. For the rest floating point is always a pain in the... well, you know