Re: HP 28C/S equivalent among HP's current products Message #6 Posted by James M. Prange (Michigan) on 20 May 2006, 8:11 a.m., in response to message #1 by Daniel Miller
I'm happy to report that HP doesn't have anything equivalent to
the 28 series among its current offerings.
Quote:
I formerly owned a 28C back in the 1980s. I dearly miss its very
complete binary/octal/hexadecimal numerals. I have never found a
comparable feature set for nondecimal bases.
"Binary integers" also have a decimal base representation in these
calculators. Actually, they're all stored the same and treated the
same for arithmetic operations, and only displayed differently
depending on the base.
Starting with the 28S, binary integers are displayed with a
trailing h, d, o, or b to indicate the base. You can enter a
binary integer in something other than the current base by
including a trailing h, d, o, or b.
All 48 and 49 series can do everything that the 28 series can with
"binary integers"; possibly even a few more things, for all I
know.
The 16C seems to have better built-in capabilities for binary
integers. Maybe there's an emulator of the 16C available for the
48 or 49 series?
Quote:
Do any of HP's current calculators have the following
capabilities:
1) binary/octal/hexadecimal fractional numerals to the right of
the radix point;
Like Luiz, as far as I know, no HP calculator has ever had this
built-in. Maybe think of it as sort of like a slide rule, where
it's up to the user to keep track of where the decimal point has
to be.
Just sort of thinking out loud here, maybe you could treat a
fractional number as an integer and a divisor; for example,
#ABC.DEFh could be treated as #ABCDEFh/(#10h^#3h), although RPL
doesn't allow raising a binary integer to a power. Maybe store
that in a list as { #ABCDEFh #3h }, where the second element is
understood to be the number of places to move the radix point to
the left.
For displaying hexadecimal numbers with a fractional part, I
suppose that you'd have to either display it as a character string
or as two separate numbers (perhaps within a list). Much the same
would apply to a decimal, octal, and binary representation with
over twelve digits.
The 49 series adds a new object type, the "exact integer", a
decimal integer with the length limited only by available memory.
As long as the calculator is in "exact" mode and you don't involve
the exact integers in any operation with "real" numbers, or force
them to reals with, for example, I\->R or \->NUM, they stay exact.
For example, the sequence:
12 10 / returns '6/5' instead of 1.2.
Binary integers can be converted to exact integers with the
sequence B\->R R\->I, but converting through real numbers limits
exact conversions to 12 significant decimal digits, so that's good
only for integers #E8D4A50FFFh and less. Exact integers can be
converted to binary integers with R\->B, although I don't know the
limit of the accuracy with that. Too bad that they didn't provide
UserRPL B\->I and I\->B commands.
For a binary integer to exact integer conversion with 64-bit
accuracy, you could use a string as an intermediate object
instead; for example:
%%HP: T(3)F(.); @ ASCII transfer header.
\<< @ Begin program.
PUSH @ Save flags and path.
DEC @ Force decimal representation.
\->STR @ Convert binary integer to string.
3. OVER SIZE 1. - SUB @ Extract digits.
STR\-> @ Convert string to exact integer
POP @ Restore flags and path.
\>> @ End program.
Note that the above doesn't force an object to the current
wordsize. If you also want that, first do a unity operation such
as adding or subracting 0, or multiplying or dividing by 1.
Converting an exact integer to a binary integer with 64-bit
accuracy is even easier:
%%HP: T(3)F(.); @ ASCII transfer header.
\<< @ Begin program.
"#" SWAP + @ Prepend binary integer delimiter.
"d" + @ Append decimal base indicator.
STR\-> @ Convert string to binary integer.
\>> @ End program.
Again, this doesn't force the binary integer to the current
wordsize (although it will be displayed that way). You can force
that by doing a unity operation after the conversion.
I don't know, but maybe using exact integers could be helpful.
Quote:
2) binary/octal/hexadecimal numerals larger than 32 bits;
All 28, 48, and 49 series can have the wordsize for binary integer
operations set from 1 through 64 bits. But note that user binary
integers are always stored (and recalled) as 64-hit numbers. The
display depends on the current wordsize and HEX/DEC/OCT/BIN
display mode. Any arithmetic, logic, shift, or rotate operation on
a binary number forces any bits more significant than specified by
the wordsize to zero.
Quote:
3) negative-to-twos-complement-viewed-as-unsigned presentation
(the equivalent in C language of: printf("%x",-37) that presents
ffffffdb in hexadecimal);
I don't follow that, but the two's complement of a binary integer
is returned by pressing the [+/-] key to invoke the NEG command.
Of course the NOT command gives you the one's complement. I expect
that you can figure out how to do what you want here. Remember to
use the appropriate wordsize.
I recall doing byte-wise big-endian / little-endian conversions on
the 48SX by using strings too. These kinds of things aren't all
that difficult to program, even though they're not built-in.
Quote:
4) setting word width for modulo arithmetic (e.g., 8-bit, 16-bit,
32-bit)?
See my response to your number 2 question.
Also, do some searches at http://www.hpcalc.org/ and
http://groups.google.com/group/comp.sys.hp48.
Regards, James
|