▼
Posts: 4
Threads: 1
Joined: Jan 1970
Am I looking at the correctly?
The "Rmdr" function is supposed to return the
remainder from an integer division. If x and y
are both positive integers the function behaves
as I would expect:
25 4 -> Rmdr 1
25 5 -> Rmdr 0
25 6 -> Rmdr 1
So far, so good. If I start to use negative numbers
though, the results are a bit surprising:
25 -4 -> Rmdr -3
25 -5 -> Rmdr 0
25 -6 -> Rmdr -5
-25 4 -> Rmdr 3
-25 5 -> Rmdr 0
-25 6 -> Rmdr 5
-25 -4 -> Rmdr -1
-25 -5 -> Rmdr 0
-25 -6 -> Rmdr -1
The "INT/" (left shift on the same key) works
as I would expect and does not make sense in
conjuction with the "Rmdr" key for negative calculations:
25 4: <- INT/ 6, -> Rmdr 1
25 -4: <- INT/ -6, -> Rmdr -3 ???
Any other proud 33s owners out there? In general I like
the 33s. The keypad is not as bad as I thought it would
be and it is still nicer to use then TI or Casio, IMHO.
Just need to identify the buggy functions to avoid.
Thanks and sorry for the long post,
Shaun
▼
Posts: 4
Threads: 1
Joined: Jan 1970
Sorry about the format, my line breaks disappeared. Supposed
to look like:
25 4 -> Rmdr 1
25 5 -> Rmdr 0
25 6 -> Rmdr 1
25 -4 -> Rmdr -3
25 -5 -> Rmdr 0
25 -6 -> Rmdr -5
etc.
Posts: 166
Threads: 28
Joined: Aug 2007
There is an error there, though it is not too large. Technically, the only time it produces a wrong answer is when you use two negative numbers. According to modular aritmetic (more info http://www.geocities.com/piguy31415926/indep_study.html) if you are finding the remainder when dividing by 5, then -4 is the same as 1. So, the calculator is right in that case, though it gives the less obvious answer (but you sometimes need to use a negative to simplify your equation... if you are dividing by 60 and you get a result of 59, it is much easier to call it -1 instead of 59... there is an example of this in the modular arithmetic document on the page above)
-Ben Salinas
Posts: 172
Threads: 5
Joined: Jan 1970
Hi Shaun,
I don't like what I'm seeing.
Ben is probably right about the 33S not strictly following the rules of modular arithmetic; I haven't checked this.
That wouldn't bother me so much, except that the 33S seems to violate a more permissive rule wrt integer division and remaindering:
In the C programming language, if "/" means integer division and "%" means remainder, then
(a/b)*b + a%b = a (assuming b non-zero)
For negative operands, the C standard does not specify the exact result, only that the above relationship must always be true. That lets compiler writers use the underlying hardware behavior, whatever it is, to give the most efficient (but not necessarily portable) implementation.
Using 25 and -4, and the integer division and remainder results given above,
(25/-4)*-4 + 25%-4 = 25
(-6)*-4 + -3 = 25
24 + -3 = 25
21 = 25
which is clearly not right. Anyone writing programs which do integer division with negative operands may be (very!) surprized at the results. To me, this constitutes a genuine bug.
I don't have a 33S so I can't go any further. Perhaps someone could investigate this a little more, with a variety of operands of both signs.
- Michael
▼
Posts: 4
Threads: 1
Joined: Jan 1970
Hi Ben and Michael,
Thanks for your replies.
I had noticed the modular aspect, but since the
"integer divide" and the "remainder" functions
are located on the same key ("%"), I expected
them to work as Michael described.
Guess I'll try contacting HP next week and see
how they respond.
Thanks,
Shaun
Posts: 1,193
Threads: 43
Joined: Jul 2005
The behavior observed by you seems consistent with an algorithm related to repetitive substraction instead of division. This may or not be correct, I think that it should be a clear definition of "reminder"...
When you use negative numbers, and check for a value to be "less" than other, the lesser number is the one with greater absolute value.
It seems that, for positive cases (both positive or both negative numbers), the 33s calculates the following:
+ 25 4: 4*6=24, the reminder is 25-24=1, because 24 is the closest multiple of 4 that is less or equal than 25
+ 25 5: 5*5=25, the reminder is 25-25=0, because 25 is the closest multiple of 5 that is less or equal than 25
+ 25 6: 6*4=24, the reminder is 25-24=1, because 24 is the closest multiple of 6 that is less or equal than 25
Now, for negative cases (one positive and one negative number), the 33s calculates the following:
- 25 4: 4*(-7)=-28, the reminder is -28-(-25)=-3, because -28 is the closest multiple of 4 that is less or equal than -25
- 25 5: 5*(-5)=-25, the reminder is -25-(-25)=0, because -25 is the closest multiple of 5 that is less or equal than -25
- 25 6: 6*(-5)=-30, the reminder is -30-(-25)=-5, because -30 is the closest multiple of 6 that is less or equal than -25
It is not very clear, but it seems consistent...
Edited: 7 Mar 2004, 2:28 p.m.
▼
Posts: 1,792
Threads: 62
Joined: Jan 2005
Shaun --
Andres just might have it right, but I'd like to point out that there's a difference between the remainder ("RMD") function and modulo division ("MOD" function).
The 41C*, 42S and RPL calc's (28/48/49) have "MOD" built in.
The 16C has "RMD" built in.
Arguments MOD RMD
25, -6 -5 1
25, -4 -3 1
-25, 4 3 -1
-25, -4 -1 -1
25, 4 1 1
Obviously, there's a difference in the definitions:
"RMD" is defined only for integer input arguments; its results are consistent with
RMD (y, x) = x * frac (y / x)
using floating-point calculations.
"MOD" can also be used with floating-point inputs. Apparently, MOD is equivalent to repeated subtraction or addition (as appropriate) of the divisor until the remainder is either zero or, lesser in magnitude and of the same sign of the divisor.
It looks as though the 33S is really doing modulo division ("MOD"), and HP ought to label and define it as such.
▼
Posts: 1,193
Threads: 43
Joined: Jul 2005
Your explanation is very good and plausible.
Perhaps the omnipresent marketing strategies dictated that "reminder" was a concept most people has (at least, after learning how to divide in primary school), while "modulo" was only known by more mathematically knowledgeable people (=> less market share).
One can imagine a scene in which some VIP asked "What is this "modulo" thing? and somebody else, just trying to ease the moment answered "Well, it is kind of "reminder", you know..."
▼
Posts: 4
Threads: 1
Joined: Jan 1970
Thanks for all the thoughts and all the input.
I've got one more wrinkle for you:
MathCAD defines the "Modulo" function, mod(x,y) as
the remainder on dividing x by y with the result
having the same sign as x.
As expected, it tests out to have the same results
as Karl Schneider's RMD function.
MatLab, however, defines it as:
MOD(x,y) is x - y.*floor(x./y)
Which matches the MOD and Rmdr functions.
I just wish HP would have kept the Integer Divide
and "Remainder" functions consistent since they share
the same key. Choosing the "MOD" function, calling it
"Rmdr", and placing is side-by-side with the Integer
Divide function is just irritating.
|