Why modulus operation work different in ruby than other languages?
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
add a comment |
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
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
or1
depending on how the CPU implements modulus with negatives and what it thinks "smallest" means:-2
is smaller than1
because-2 < 1
but-2
is bigger than1
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
add a comment |
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
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
ruby
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
or1
depending on how the CPU implements modulus with negatives and what it thinks "smallest" means:-2
is smaller than1
because-2 < 1
but-2
is bigger than1
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
add a comment |
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
or1
depending on how the CPU implements modulus with negatives and what it thinks "smallest" means:-2
is smaller than1
because-2 < 1
but-2
is bigger than1
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
add a comment |
1 Answer
1
active
oldest
votes
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
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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
add a comment |
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
add a comment |
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
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
answered Nov 19 '18 at 16:18
Sergio TulentsevSergio Tulentsev
180k30289304
180k30289304
add a comment |
add a comment |
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
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
or1
depending on how the CPU implements modulus with negatives and what it thinks "smallest" means:-2
is smaller than1
because-2 < 1
but-2
is bigger than1
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