Ask Your Question
1

Why does Sage return negative number when evaluating 181.0%360

asked 2014-11-23 16:32:43 +0100

ndomes gravatar image

updated 2014-11-23 17:54:27 +0100

    sage: print 181%360  , 181.0%360

    181 -179.000000000000
edit retag flag offensive close merge delete

1 Answer

Sort by ยป oldest newest most voted
1

answered 2014-11-23 19:43:29 +0100

Luca gravatar image

So that this code works

sage: a = 181.0
sage: b = 360
sage: n = (a / b).round()
sage: b * n + (a % b) == a
True

From the sage docstring (which you can read by typing a.__mod__?)

Return the value of "left - n*right", rounded according to the rounding mode of the parent, where "n" is the integer quotient of "x" divided by "y". The integer "n" is rounded toward the nearest integer (ties rounded to even).

edit flag offensive delete link more

Comments

My question wasn't HOW Sage evaluates 181.0%360, the question is WHY is it done this way. Pure Python returns 181 , Wolfram Alpha returns 181. when entering 181. mod 360 - Sage behaves different - what for?

ndomes gravatar imagendomes ( 2014-11-27 10:41:08 +0100 )edit

Exactly for the reason I said: so that the output is consistent with the output of a/b, the rounding mode, and the mathematical definition of Euclidean division (which in truth does not make much sense for floats).

In Python rounding is done to the lowest integer, so it makes sense to return 181, indeed

>>> 360 * int(181.0 / 360) + (181.0 % 360)
181.0

In Mathematica, rounding is done to the closest integer, and indeed

360*round(181.0 / 360) + (181.0 mod 360)

answers 541 on WolframAlpha. Oups! Guess Mathematica does not really care for mathematical consistency.

Luca gravatar imageLuca ( 2014-11-30 21:50:26 +0100 )edit

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools

2 followers

Stats

Asked: 2014-11-23 16:32:43 +0100

Seen: 555 times

Last updated: Nov 23 '14