!standard 4.5.5(8) 11-07-28 AI05-0260-1/02
!class binding interpretation 11-06-19
!status Amendment 2012 11-07-28
!status ARG Approved 11-1-0 11-06-26
!status work item 11-06-16
!status received 11-05-17
!priority Low
!difficulty Easy
!qualifier Error
!subject Pedantic question on the wording of the definition of modulo
!summary
Zero doesn't have a sign, so we need to except it from the wording.
!question
4.5.5(8) says:
The signed integer modulus operation is defined such that the result of A mod
B has the sign of B and an absolute value less than the absolute value of B;
in addition, for some signed integer value N, the result satisfies the
relation:
A = B*N + (A mod B)
If A := 0 and B < 0 then the only solution to the relation that has abs(A mod B)
< abs(B) is A mod B = 0. But 0 does not have the "sign of B" (it is not
negative). Should this be fixed? (Yes.)
!wording
Modify the start of 4.5.5(8):
The signed integer modulus operation is defined such that the result
of A mod B {is either zero, or} has the sign of B and an absolute
value less than the absolute value of B; in addition, ...
!discussion
!corrigendum 4.5.5(8)
@drepl
The signed integer modulus operator is defined such that the result of A @b B has
the sign of B and an absolute value less than the absolute value of B; in addition,
for some signed integer value N, this result satisfies the relation:
@dby
The signed integer modulus operator is defined such that the result of A @b B is
either zero or has the sign of B and an absolute value less than the absolute value
of B; in addition, for some signed integer value N, this result satisfies the
relation:
!ACATS Test
None needed.
!ASIS
No change needed.
!appendix
!topic Pedantic question on the wording of the definition of modulo
!reference Ada 2005 RM
!from Martin Brain 11-05-17
!keywords multiplicative operators, modulo, pendantry
!discussion
In the Ada 2005 LRM (ISO/IEC 8652:2007 Ed 3), Section 4.5.5 defines the modulo
operator as:
The signed integer modulus operation is defined such that the result of A mod B
has the sign of B and an absolute value less than the absolute value of B; in
addition, for some signed integer value N, the result satisfies the relation:
A = B*N + (A mod B)

If A := 0 and B < 0 then the only solution to the relation that has abs(A mod B)
< abs(B) is A mod B = 0, which I believe to be the intended and expected result.
However the sign of zero is not the same as the sign of a negative number,
giving a contradiction. Although this is a point of pedantry, it would be nice
if the wording of the definition was changed.
****************************************************************
From: Adam Beneschan
Sent: Tuesday, May 17, 2011 2:42 PM
I think I'd change it to
The signed integer modulus operation is defined such that the result
of A mod B is either zero, or has the sign of B and an absolute
value less than the absolute value of B; in addition, ...
****************************************************************