Why modulus operation work different in ruby than other languages?












1















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 '18 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 '18 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 '18 at 5:56


















1















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 '18 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 '18 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 '18 at 5:56
















1












1








1








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 '18 at 5:50









sawa

130k29202301




130k29202301










asked Nov 19 '18 at 16:06









Pradhumn SharmaPradhumn Sharma

1116




1116








  • 4





    You want -5.remainder(3) which returns -2

    – Stefan
    Nov 19 '18 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 '18 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 '18 at 5:56
















  • 4





    You want -5.remainder(3) which returns -2

    – Stefan
    Nov 19 '18 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 '18 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 '18 at 5:56










4




4





You want -5.remainder(3) which returns -2

– Stefan
Nov 19 '18 at 16:51





You want -5.remainder(3) which returns -2

– Stefan
Nov 19 '18 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 '18 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 '18 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 '18 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 '18 at 5:56














1 Answer
1






active

oldest

votes


















2














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',
    autoActivateHeartbeat: false,
    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









    2














    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




























      2














      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


























        2












        2








        2







        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 '18 at 16:18









        Sergio TulentsevSergio Tulentsev

        180k30289304




        180k30289304






























            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            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

            Biblatex bibliography style without URLs when DOI exists (in Overleaf with Zotero bibliography)

            ComboBox Display Member on multiple fields

            Is it possible to collect Nectar points via Trainline?