Why modulus operation work different in ruby than other languages?











up vote
1
down vote

favorite












In Ruby, I get:



-5 % 3 # => 1


whereas other languages like PHP, Javascript, C++, and Java all produce the result -2. I don't understand this concept. I hope someone can explain this ruby's calculation method. It would be better if you could use an example of how it works.










share|improve this question




















  • 4




    You want -5.remainder(3) which returns -2
    – Stefan
    Nov 19 at 16:51






  • 1




    AFAIK -5 % 3 is implementation defined in C and C++, that can be either -2 or 1 depending on how the CPU implements modulus with negatives and what it thinks "smallest" means: -2 is smaller than 1 because -2 < 1 but -2 is bigger than 1 because |-2| > |1|.
    – mu is too short
    Nov 19 at 23:55










  • It is a matter of what you want as the set of representatives of the elements derived by modulo. It is whether you think {-2, -1, 0} more natural or {0, 1, 2} more natural. Ruby takes the latter, and so do I.
    – sawa
    Nov 21 at 5:56

















up vote
1
down vote

favorite












In Ruby, I get:



-5 % 3 # => 1


whereas other languages like PHP, Javascript, C++, and Java all produce the result -2. I don't understand this concept. I hope someone can explain this ruby's calculation method. It would be better if you could use an example of how it works.










share|improve this question




















  • 4




    You want -5.remainder(3) which returns -2
    – Stefan
    Nov 19 at 16:51






  • 1




    AFAIK -5 % 3 is implementation defined in C and C++, that can be either -2 or 1 depending on how the CPU implements modulus with negatives and what it thinks "smallest" means: -2 is smaller than 1 because -2 < 1 but -2 is bigger than 1 because |-2| > |1|.
    – mu is too short
    Nov 19 at 23:55










  • It is a matter of what you want as the set of representatives of the elements derived by modulo. It is whether you think {-2, -1, 0} more natural or {0, 1, 2} more natural. Ruby takes the latter, and so do I.
    – sawa
    Nov 21 at 5:56















up vote
1
down vote

favorite









up vote
1
down vote

favorite











In Ruby, I get:



-5 % 3 # => 1


whereas other languages like PHP, Javascript, C++, and Java all produce the result -2. I don't understand this concept. I hope someone can explain this ruby's calculation method. It would be better if you could use an example of how it works.










share|improve this question















In Ruby, I get:



-5 % 3 # => 1


whereas other languages like PHP, Javascript, C++, and Java all produce the result -2. I don't understand this concept. I hope someone can explain this ruby's calculation method. It would be better if you could use an example of how it works.







ruby






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 21 at 5:50









sawa

128k27193297




128k27193297










asked Nov 19 at 16:06









Pradhumn Sharma

1116




1116








  • 4




    You want -5.remainder(3) which returns -2
    – Stefan
    Nov 19 at 16:51






  • 1




    AFAIK -5 % 3 is implementation defined in C and C++, that can be either -2 or 1 depending on how the CPU implements modulus with negatives and what it thinks "smallest" means: -2 is smaller than 1 because -2 < 1 but -2 is bigger than 1 because |-2| > |1|.
    – mu is too short
    Nov 19 at 23:55










  • It is a matter of what you want as the set of representatives of the elements derived by modulo. It is whether you think {-2, -1, 0} more natural or {0, 1, 2} more natural. Ruby takes the latter, and so do I.
    – sawa
    Nov 21 at 5:56
















  • 4




    You want -5.remainder(3) which returns -2
    – Stefan
    Nov 19 at 16:51






  • 1




    AFAIK -5 % 3 is implementation defined in C and C++, that can be either -2 or 1 depending on how the CPU implements modulus with negatives and what it thinks "smallest" means: -2 is smaller than 1 because -2 < 1 but -2 is bigger than 1 because |-2| > |1|.
    – mu is too short
    Nov 19 at 23:55










  • It is a matter of what you want as the set of representatives of the elements derived by modulo. It is whether you think {-2, -1, 0} more natural or {0, 1, 2} more natural. Ruby takes the latter, and so do I.
    – sawa
    Nov 21 at 5:56










4




4




You want -5.remainder(3) which returns -2
– Stefan
Nov 19 at 16:51




You want -5.remainder(3) which returns -2
– Stefan
Nov 19 at 16:51




1




1




AFAIK -5 % 3 is implementation defined in C and C++, that can be either -2 or 1 depending on how the CPU implements modulus with negatives and what it thinks "smallest" means: -2 is smaller than 1 because -2 < 1 but -2 is bigger than 1 because |-2| > |1|.
– mu is too short
Nov 19 at 23:55




AFAIK -5 % 3 is implementation defined in C and C++, that can be either -2 or 1 depending on how the CPU implements modulus with negatives and what it thinks "smallest" means: -2 is smaller than 1 because -2 < 1 but -2 is bigger than 1 because |-2| > |1|.
– mu is too short
Nov 19 at 23:55












It is a matter of what you want as the set of representatives of the elements derived by modulo. It is whether you think {-2, -1, 0} more natural or {0, 1, 2} more natural. Ruby takes the latter, and so do I.
– sawa
Nov 21 at 5:56






It is a matter of what you want as the set of representatives of the elements derived by modulo. It is whether you think {-2, -1, 0} more natural or {0, 1, 2} more natural. Ruby takes the latter, and so do I.
– sawa
Nov 21 at 5:56














1 Answer
1






active

oldest

votes

















up vote
2
down vote













It's in the docs: https://ruby-doc.org/core-2.5.0/Numeric.html#method-i-divmod




If q, r = x.divmod(y), then



q = floor(x/y)
x = q*y + r


The quotient is rounded toward negative infinity




So q is -3 (-5 / 2 and round down, as per usual integer division rules). And r = x - q * y = -5 - -3 * 2 = 1






share|improve this answer





















    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














     

    draft saved


    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53378554%2fwhy-modulus-operation-work-different-in-ruby-than-other-languages%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes








    up vote
    2
    down vote













    It's in the docs: https://ruby-doc.org/core-2.5.0/Numeric.html#method-i-divmod




    If q, r = x.divmod(y), then



    q = floor(x/y)
    x = q*y + r


    The quotient is rounded toward negative infinity




    So q is -3 (-5 / 2 and round down, as per usual integer division rules). And r = x - q * y = -5 - -3 * 2 = 1






    share|improve this answer

























      up vote
      2
      down vote













      It's in the docs: https://ruby-doc.org/core-2.5.0/Numeric.html#method-i-divmod




      If q, r = x.divmod(y), then



      q = floor(x/y)
      x = q*y + r


      The quotient is rounded toward negative infinity




      So q is -3 (-5 / 2 and round down, as per usual integer division rules). And r = x - q * y = -5 - -3 * 2 = 1






      share|improve this answer























        up vote
        2
        down vote










        up vote
        2
        down vote









        It's in the docs: https://ruby-doc.org/core-2.5.0/Numeric.html#method-i-divmod




        If q, r = x.divmod(y), then



        q = floor(x/y)
        x = q*y + r


        The quotient is rounded toward negative infinity




        So q is -3 (-5 / 2 and round down, as per usual integer division rules). And r = x - q * y = -5 - -3 * 2 = 1






        share|improve this answer












        It's in the docs: https://ruby-doc.org/core-2.5.0/Numeric.html#method-i-divmod




        If q, r = x.divmod(y), then



        q = floor(x/y)
        x = q*y + r


        The quotient is rounded toward negative infinity




        So q is -3 (-5 / 2 and round down, as per usual integer division rules). And r = x - q * y = -5 - -3 * 2 = 1







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 19 at 16:18









        Sergio Tulentsev

        177k29286301




        177k29286301






























             

            draft saved


            draft discarded



















































             


            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53378554%2fwhy-modulus-operation-work-different-in-ruby-than-other-languages%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Wiesbaden

            Marschland

            Dieringhausen