16C internal floating point format?
|
04-03-2021, 08:48 PM
Post: #1
|
|||
|
|||
16C internal floating point format?
Hi all,
I'm in the middle of writing a clean-room 16C simulator, as a hobby project. I don't have a real 16C (but my 15C is still working great!), and I don't want to anything like look at ROM images, or run out and buy a calculator. But I do have a question as to the behavior of a real 16C as regards the binary representation of floating point numbers. I'm guessing it's BCD mantissa and exponent, with one nybble for the mantissa's sign and one for the exponent's - that fits nicely in 56 bits - but I don't know which digit goes where, and there are a few edge cases besides. So, if someone has access to a real calculator, could you do me a favor and let me know what you get in (56 bit) hex when you store the following numbers into registers? 0.0 42.0 -42.0 1e42 1e-42 0.0001e-99 9.999999999e99, and finally, the results of (99 <ent> 9e99 *), (-99 <ent> 9e99 *) and (0 1/x). I think that covers all the bases. Thanks! In return, I'll be happy to give you a free copy, when/if I have it working well. That's not much of a prize, though, since I plan to give it away, and put up the source on github. BTW, I'm writing it in Flutter, which will make it easy to deploy most everywhere. For reference, I made an Android and desktop Java version of Emmet-Gray's WRPN (after asking him if he was OK with it); my version cleans up the appearance on high-res screens by using rendered fonts (see jrpn.jovial.com). I was looking for a project to keep myself out of trouble for, oh, about another month of stay-at-home, and making a higher fidelity simulation is a good fit, so I'm writing one from scratch. Cheers, Bill |
|||
04-03-2021, 10:39 PM
(This post was last modified: 04-03-2021 11:01 PM by ThomasF.)
Post: #2
|
|||
|
|||
RE: 16C internal floating point format?
(04-03-2021 08:48 PM)billf Wrote: So, if someone has access to a real calculator, could you do me a favor and let me know what you get in (56 bit) hex when you store the following numbers into registers? 0.0 42.0 -42.0 1e42 1e-42 0.0001e-99 9.999999999e99, and finally, the results of (99 <ent> 9e99 *), (-99 <ent> 9e99 *) and (0 1/x). I think that covers all the bases. Hi Bill, This is what I get: 0.0 --> 0h 42.0 --> 04200000000001h -42.0 --> 94200000000001h 1e42 --> 1000000000042h 1e-42 --> 1000000000958h 0.0001e-99 --> not possible to enter 9.999999999e99 --> 09999999999099h (99 <ent> 9e99 *) --> 09999999999099h (-99 <ent> 9e99 *) --> 99999999999099h (0 1/x) --> Just gives "Error 0" Note that 99 <ent> 9e99 gives overflow - i.e. it becomes 9.999999999e99 I also used 64 bit wordsize when in hex-mode (FLOAT 8 - <enter number> STO - hex 0 WSIZE RCL), since I expect that registers are in 64 bits length (to be able to store a 64 bit integer), correct me if I am wrong. Edit: was partly wrong. Used the I-register which is always full size! Hope this helps you! Cheers, Thomas [35/45/55/65/67/97/80 21/25/29C 31E/32E/33E|C/34C/38E 41C|CV|CX 71B 10C/11C/12C/15C|CE/16C 32S|SII/42S 28C|S 48GX/49G/50G 35S 41X] |
|||
04-04-2021, 12:21 AM
Post: #3
|
|||
|
|||
RE: 16C internal floating point format?
Perfect, thanks Thomas! Exactly what I needed. Little-endian BCD, which is slightly surprising (to me), but sensible.
One other semi-related question: For overflow, is it a flashing "9.999999 99" (like the 15C does), or does it set the G flag, or neither? |
|||
04-04-2021, 01:24 AM
Post: #4
|
|||
|
|||
RE: 16C internal floating point format?
(04-04-2021 12:21 AM)billf Wrote: One other semi-related question: For overflow, is it a flashing "9.999999 99" (like the 15C does), or does it set the G flag, or neither? The 9.999999 99 doesn't flash (it just displays steadily, like a normal result), and the G annunciator lights up (AKA flag 5 is set). <0|ΙΈ|0> -Joe- |
|||
04-04-2021, 01:52 AM
Post: #5
|
|||
|
|||
RE: 16C internal floating point format?
Great! That's a little easier to implement :-) Thanks again.
|
|||
04-04-2021, 02:32 AM
Post: #6
|
|||
|
|||
RE: 16C internal floating point format?
As the Google TPM responsible for the team contributing to Flutter there, thanks for choosing to do it in Flutter!
Let me know if you have questions for the team, and I'll see if I can get input from one of the devs I work with. Looking forward to seeing the simulator! I'd be a happy beta tester or user, for sure. |
|||
04-06-2021, 02:37 PM
Post: #7
|
|||
|
|||
RE: 16C internal floating point format?
BTW, slight correction - I meant big-endian. The internal format is rather delightful - if anyone's curious, here's my description:
Code: /// |
|||
04-06-2021, 05:29 PM
Post: #8
|
|||
|
|||
RE: 16C internal floating point format?
Yes, that seems to follow the way HP implemented the representation of floating points in most (if not all) of its 56-bit CPUs.
See e.g. the following thread for some more information: https://www.hpmuseum.org/cgi-sys/cgiwrap...read=90949 Cheers, Thomas [35/45/55/65/67/97/80 21/25/29C 31E/32E/33E|C/34C/38E 41C|CV|CX 71B 10C/11C/12C/15C|CE/16C 32S|SII/42S 28C|S 48GX/49G/50G 35S 41X] |
|||
04-14-2021, 07:58 PM
(This post was last modified: 04-14-2021 07:59 PM by billf.)
Post: #9
|
|||
|
|||
RE: 16C internal floating point format?
Hi Thomas and/or all,
One other behavior question: What happens when you try to enter the following program? G SF 9 How about G SF A My theory is that they behave differently: I think the calculator will let you enter SF-9 as a program instruction, BUT executing that program instruction is guaranteed to generate an "Error 1". On the other hand, I'm betting it won't let you enter SF-A at all. Is my guess accurate? What I see is that the back of the calculator (according to an image I have) says that "Error 1" can mean "F > 5," so it must let you input invalid flag numbers. However if I set the max at F (15), I get too many opcodes -- when I limit it to 9, I get 255 opcodes, which makes total sense. This even means 0 is left over as NOP, which maybe they use internally when running off the end of a program, since it looks like the number of program lines is stored internally divided by 7. It's a little weird that they allow entry of invalid flag numbers in program opcodes, but maybe that aligns the instruction set of the 16C with the 15C or something. This really was a superbly engineered calculator. |
|||
04-14-2021, 08:26 PM
Post: #10
|
|||
|
|||
RE: 16C internal floating point format?
Hi Bill,
Entering any of those lines generates "Error 1", both in Run and in Prgm mode. Any flag above 5 generates "Error 1". On the 15C I know that someone found a way to enter "synthetic" instructions to be able to enter new "opcodes", but to my knowledge this has not been done on the 16C. Cheers, Thomas [35/45/55/65/67/97/80 21/25/29C 31E/32E/33E|C/34C/38E 41C|CV|CX 71B 10C/11C/12C/15C|CE/16C 32S|SII/42S 28C|S 48GX/49G/50G 35S 41X] |
|||
05-01-2021, 10:19 PM
Post: #11
|
|||
|
|||
New 16C simulator - alpha on web
Hi Thomas, and anyone else interested,
I have a first alpha up on the web! Let me know what you think: https://new.jrpn.jovial.com/ There's a link under Help to submit any issues you run into. On the issues page, you'll see a few mostly cosmetic "to do" items (like making a portrait layout). I haven't put up a build for other platforms, just because that takes work for not much value... Of course the real thing will have native builds for All The Platforms. I'll post an announcement outside this thread in a few days if all goes well. Cheers, Bill |
|||
05-02-2021, 02:31 AM
Post: #12
|
|||
|
|||
RE: 16C internal floating point format?
Nice work!! I like it.
I'm going to flash this in front of the team this week --- they'll be glad to see a good hobbyist project like this in Flutter, and I think the notion of reproducing a programmable calculator with Flutter will be one several of them find rewarding. |
|||
05-02-2021, 05:37 AM
Post: #13
|
|||
|
|||
RE: 16C internal floating point format?
Very cool! Have a 16C but now I also have a bookmarked one, thanks for that!
|
|||
« Next Oldest | Next Newest »
|
User(s) browsing this thread: 1 Guest(s)