Scripsit ille »John Andrews« john_b_andrews@yahoo.com:
Why does this program:
print -3 / 10, “\n”
print -1?
If I underflow a negative int in C, I get zero.
If I underflow a negative integer in Perl (using “use integer”),
I get zero.Why does Ruby give me -1?
It’s doing the “mathematical” division.
Integer division with remainder is mathematically defined as follows:
For a given a \in Z and b \in N without 0 you calculate q \in Z
and r \in [0, b[ with
a = bq + r
q is the quotient (in Ruby a/b) and r is the remainder (in Ruby a%b).
I’ll write for this: div(a, b) = (q, r).
Perl also does the “mathematical” division:
rpolzer@katsuragi rpolzer $ perl -e ‘print -1%10, “\n”’
9
But:
rpolzer@katsuragi rpolzer $ perl -Minteger -e ‘print -1%10, “\n”’
-1
as defined by Intel on x86 systems (other architectures may behave
differently). Without ‘use integer’, there’s no such thing as integer
division in Perl, so I assume you were using it.
BTW: Ruby seems to define division by negative divisors like this:
, r == 0: (-q, r)
div(a, -b) = <
` r != 0: (-q-1, r-b)
or like above if you define [0, b[ being equivalent to ]b, 0] for
negative b.
···
–
+++++[<<++<+++++++>>>-]+[+[>>+<+<-]>[<+>-]>-[[>>>>>+<<<<<<+>-]<[>+<-]<[>>>+<<
+<-]>[<+>-]>>>-[+>>>[>>+<+<-]>[<+>-]>[<<<<<[>+>+<<-]>[<+>-]+>[<->[-]]<[-<+<[>-<[
+<<-]]>>[<<+>>-]]<<->>>>>>-]<<<<<<<<+>>>-]+<<<->>>>>>[<<<<+>>>>-]<<<-<<-<[-]+>
[<<->>[-]]<<[->[<<<+>>>-]<]>]<+<<[>>-<<[-]]>>[-<[>+<<<<.>>>-]>[<+>-]<<<.>>>]<],