Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?

modulo 1 (%1) and fractional part of a number

by JBCookin (Initiate)
on Sep 11, 2018 at 07:24 UTC ( #1222114=perlmeditation: print w/replies, xml ) Need Help??

Is there a reason Perl could not use %1 to indicate the fractional part of a number. As far as I can tell, right now %1 always returns 0.

This feature would be a much simpler way of getting the fractional part of a number than anything else I've seen, and it's hard to see any downside.

  • Comment on modulo 1 (%1) and fractional part of a number

Replies are listed 'Best First'.
Re: modulo 1 (%1) and fractional part of a number
by hippo (Canon) on Sep 11, 2018 at 08:04 UTC
    a much simpler way of getting the fractional part of a number than anything else I've seen

    Have you seen $foo - int $foo? That's both simple and clear, no?

Re: modulo 1 (%1) and fractional part of a number
by Your Mother (Bishop) on Sep 11, 2018 at 07:52 UTC

    Itís because 1 goes into every single whole number without remainder. So, I have to imagine you misunderstand what the modulo operator does(?).

      It's understandable to have a different interpretation of the modulo operator: different languages implement it differently, and Perl's implementation is not the most straightforward. If you come from the spreadsheet world, Excel's MOD() and VBA's Mod both work with floating point. C's % works purely with integers, or fmod() for floating point. Perl's %, OTOH, has a bunch of conditionals to determine integer vs. floating-point context. I'll expound on them slightly, in case it might help JBCookin:

      • Binary "%" is the modulo operator, which computes the division remainder of its first argument with respect to its second argument.:
        ⇒ if someone just read the first line of the paragraph, there is no mention of integer vs float.
      • Given integer operands $m and $n: If $n is positive, then $m % $n is $m minus the largest multiple of $n less than or equal to $m . If $n is negative, then $m % $n is $m minus the smallest multiple of $n that is not less than $m (that is, the result will be less than or equal to zero). :
        ⇒ explicitly integer condition
      • If the operands $m and $n are floating point values and the absolute value of $n (that is abs($n)) is less than (UV_MAX + 1) , only the integer portion of $m and $n will be used in the operation (Note: here UV_MAX means the maximum of the unsigned integer type).:
        ⇒ so when the divisor happens to fit under some maximum integer, then both $m and $n are truncated to integers. (I believe that perl -V:intsize, which shows the number of bytes in an integer, will also be the number of bytes in an unsigned integer... but it might use perl -V:ivsize instead... someone with more perlguts knowledge than me can clarify)
      • If the absolute value of the right operand (abs($n)) is greater than or equal to (UV_MAX + 1) , "%" computes the floating-point remainder $r in the equation ($r = $m - $i*$n) where $i is a certain integer that makes $r have the same sign as the right operand $n (not as the left operand $m like C function fmod() ) and the absolute value less than that of $n .:
        ⇒ so only with a very large divisor $n would use full floating point modulo.

      JBCookin, I hope this helps you understand better... And hippo's solution should give you the fractional component you need.

      update: strike the invalid interpretation; thanks syphilis++ for confirmation of the alternate

        ... but it might use perl -V:ivsize instead...

        Yes, "ivsize" is what you need to look at. That tells you how many bytes there are in the signed and unsigned perl integers (IV and UV).
        "intsize" merely tells you the number of bytes in the C "int" for the compiler that built perl, and that is commonly less than the number of bytes in the perl integer.


      Yea I know what it does. My point is wouldn't it be more useful if m%n worked the way it does now for all n where n≠1, but when n=1 it returns the fractional part, since right now it only returns 0.

      I understand why it only returns 0, I just think that it would be more useful if for the specific case m%1 the return value is the fractional part of m.

        This kind of DWIM magic edge cases is actually causing much trouble in Perl.

        Better define your own custom function.

        Cheers Rolf
        (addicted to the Perl Programming Language :)
        Wikisyntax for the Monastery FootballPerl is like chess, only without the dice

Re: modulo 1 (%1) and fractional part of a number
by roboticus (Chancellor) on Sep 14, 2018 at 20:01 UTC


    Rather than making a special oddball case for %, I'd suggest a better solution would be to just add fmod() (a standard C function) to the list of numeric functions we already have.

    Update: I just happened to search CPAN, and found that POSIX::2008 provides the fmod function, there may be others as well.


    When your only tool is a hammer, all problems look like your thumb.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlmeditation [id://1222114]
Approved by Discipulus
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others contemplating the Monastery: (3)
As of 2018-09-22 22:20 GMT
Find Nodes?
    Voting Booth?
    Eventually, "covfefe" will come to mean:

    Results (190 votes). Check out past polls.

    • (Sep 10, 2018 at 22:53 UTC) Welcome new users!