HP Forums

Full Version: Comparisons with zero on HP-65
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hi all.

The HP-65's looping and branching were (and still are) quite functional and powerful. Although only comparisons between X and Y were available, outside of putting zero on the stack, what are some other ways to accomplish comparisons between X and zero? What are some ways to achieve X and 0 comparisons which streamline program steps?

Thanks
(08-28-2017 09:30 PM)Matt Agajanian Wrote: [ -> ]What are some ways to achieve X and 0 comparisons which streamline program steps?

"Some ways"? I wonder if there is even one single way to compare X with 0 without placing a zero in X or Y.

The HP65 does not have tests that compare X with 0. So any method to do so has to use at least two steps. This means that "0 X=Y?" (resp. other tests) is as short as it gets. More streamlining simply is not possible.

But I'll be glad if you prove me wrong. ;-)

Dieter
(08-29-2017 10:01 PM)Dieter Wrote: [ -> ]
(08-28-2017 09:30 PM)Matt Agajanian Wrote: [ -> ]What are some ways to achieve X and 0 comparisons which streamline program steps?

"Some ways"? I wonder if there is even one single way to compare X with 0 without placing a zero in X or Y.

The HP65 does not have tests that compare X with 0. So any method to do so has to use at least two steps. This means that "0 X=Y?" (resp. other tests) is as short as it gets. More streamlining simply is not possible.

But I'll be glad if you prove me wrong. ;-)

Dieter

Nope! But, I just thought I'd ask and see if our group had clever shortcuts to allow X to stay in the X register instead of being pushed into Y. But yes, that's about the shortest shortcut there is.

Thanks
(08-29-2017 10:14 PM)Matt Agajanian Wrote: [ -> ]Nope! But, I just thought I'd ask and see if our group had clever shortcuts to allow X to stay in the X register instead of being pushed into Y.

X doesn't have to get pushed to Y. You can always add another step and add an X<>Y.
Or you simply place the zero before the value which is compared to 0 is calculated:

Instead of...
Code:
RCL 1
RCL 2
x
RCL 3
RCL 4
x
+
0
X<>Y    ; optional
X=Y?
...

...simply do it this way:
Code:
0
RCL 1
RCL 2
x
RCL 3
RCL 4
x
+
X=Y?
...

Dieter
How about:

Code:
e^x
STO 8
CLx
LSTx
DSZ
GTO
<false>
<true>

Works for small values of x (-227 <= x <= 222).
(08-29-2017 10:32 PM)Mark Hardman Wrote: [ -> ]How about:

Code:
e^x
STO 8
CLx
LSTx
DSZ
GTO
<false>
<true>

Works for small values of x (-227 <= x <= 222).

Clever and innovative!
(08-29-2017 10:32 PM)Mark Hardman Wrote: [ -> ]How about:

Code:
e^x
STO 8
CLx
LSTx
DSZ
GTO
<false>
<true>

Works for small values of x (-227 <= x <= 222).

Let me see if I understand this.

For x > ln 2 the e^x command returns a value > 2. So DSZ decrements this to a value >1 and the next step is not skipped.

For 0 < x < ln 2 the e^x command returns a value between 1 and less than 2. So DSZ decrements this to something between 0 and 0,999... and the next step is skipped.

For x < 0 the e^x command returns a value between 0 and less than 1. So DSZ decrements this to something between -1 and 0. I assume that this causes the next step to be skipped.

Somewhere between x=–23 and x=–24 the e^x result is so close to 0 that DSZ decrements this to a plain –1. I don't know how if the HP65 then skipped the next step or not, but I can say that the HP67 does not (!).

But this way the threshold for skip/no-skip is not 0, but ln 2 = 0,6931...
And maybe there is a second threshold somewhere below –20 (not sure).

Did I miss something here?

Dieter
(08-30-2017 06:43 PM)Dieter Wrote: [ -> ]Let me see if I understand this.

For x > ln 2 the e^x command returns a value > 2. So DSZ decrements this to a value >1 and the next step is not skipped.

For 0 < x < ln 2 the e^x command returns a value between 1 and less than 2. So DSZ decrements this to something between 0 and 0,999... and the next step is skipped.

For x < 0 the e^x command returns a value between 0 and less than 1. So DSZ decrements this to something between -1 and 0. I assume that this causes the next step to be skipped.

Somewhere between x=–23 and x=–24 the e^x result is so close to 0 that DSZ decrements this to a plain –1. I don't know how if the HP65 then skipped the next step or not, but I can say that the HP67 does not (!).

But this way the threshold for skip/no-skip is not 0, but ln 2 = 0,6931...
And maybe there is a second threshold somewhere below –20 (not sure).

Did I miss something here?

Dieter

DSZ only skips 2 steps if the value in R8 is exactly zero after being decremented by 1. After posting I realized that there are underflow conditions that will result in e^x returning a value of exactly 1. Results of e^x where -1e-11 <= x <= 1e-10 will also return exactly 1.

I concede that it is not the best solution, but it might have some value in limited cases.

Mark Hardman
(08-30-2017 09:08 PM)Mark Hardman Wrote: [ -> ]DSZ only skips 2 steps if the value in R8 is exactly zero after being decremented by 1.

OK, that's something I did not know. The HP67 skips one step if INT(RI) is zero.
So your method is a X≠0? test. It turns a zero into 1 which is then decremented to zero again and DSZ skips.

Or maybe it's more like a X~=0? test:

(08-30-2017 09:08 PM)Mark Hardman Wrote: [ -> ]After posting I realized that there are underflow conditions that will result in e^x returning a value of exactly 1. Results of e^x where -1e-11 <= x <= 1e-10 will also return exactly 1.

So the method tests whether e^x rounds to 1 or not.

Dieter
The 34S's DSZ behaves the same as the 67, I didn't realise the 65 was different.


Pauli
(08-31-2017 09:34 AM)Paul Dale Wrote: [ -> ]The 34S's DSZ behaves the same as the 67,

That's fine by me. ;-)
This seems to be one of the improvements of the HP67 compared to its predecessor.

(08-31-2017 09:34 AM)Paul Dale Wrote: [ -> ]I didn't realise the 65 was different.

Me neither. But good to know.
Now I think I wll have to try the Panamatic HP65 emulator.

Edit: The mentioned emulator should run the original microcode and thus behave like the real thing. According to my results the interval around zero where e^x is rounded to 1 is –6,1 E–11 < x < +5 E–10.

Dieter
Reference URL's