HP 50g: Neighbour Function (Dedekind Cut) Programme Challenge - Printable Version +- HP Forums (https://www.hpmuseum.org/forum) +-- Forum: HP Calculators (and very old HP Computers) (/forum-3.html) +--- Forum: General Forum (/forum-4.html) +--- Thread: HP 50g: Neighbour Function (Dedekind Cut) Programme Challenge (/thread-9170.html) |
HP 50g: Neighbour Function (Dedekind Cut) Programme Challenge - Gerald H - 09-27-2017 07:33 AM In this thread http://www.hpmuseum.org/forum/thread-9156.html Joe Horn reminds us of the NEIGHBOR function for the HP 71-B. I have a 270.5 Byte programme which for real input returns both the upper & lower neighbours of input on the 50g. Can anyone produce a shorter programme? RE: HP 50g: Neighbour Function (Dedekind Cut) Programme Challenge - Joe Horn - 09-27-2017 07:39 AM I'd LOVE to see your program. For years I've been living with this atrocity called NABR. It adds X ULPS onto Y. Example: 5 ENTER 2 NABR --> 5.00000000002 << SWAP DUP XPON SWAP MANT .00000000001 4. ROLL * + SWAP ALOG * >> Fails when Y=0, and gets the wrong answer for 1 ENTER -1 NABR. RE: HP 50g: Neighbour Function (Dedekind Cut) Programme Challenge - Gerald H - 09-27-2017 07:49 AM (09-27-2017 07:39 AM)Joe Horn Wrote: I'd LOVE to see your program. For years I've been living with this atrocity called NABR. It adds X ULPS onto Y. Example: 5 ENTER 2 NABR --> 5.00000000002 Doesn't work. Edit: Does work. RE: HP 50g: Neighbour Function (Dedekind Cut) Programme Challenge - Gerald H - 09-27-2017 07:50 AM Sorry, works. RE: HP 50g: Neighbour Function (Dedekind Cut) Programme Challenge - Gerald H - 09-27-2017 07:52 AM (09-27-2017 07:39 AM)Joe Horn Wrote: I'd LOVE to see your program. For years I've been living with this atrocity called NABR. It adds X ULPS onto Y. Example: 5 ENTER 2 NABR --> 5.00000000002 Very nice, could be the basis of an answer to my post. RE: HP 50g: Neighbour Function (Dedekind Cut) Programme Challenge - Joe Horn - 09-27-2017 08:06 AM (09-27-2017 07:52 AM)Gerald H Wrote: Very nice, could be the basis of an answer to my post. After struggling with this, I gave up on it years ago. Please share your program. I'd love to see how you did it! Or is this a kind of mini-challenge? If so, I can't wait to see what folks here come up with! RE: HP 50g: Neighbour Function (Dedekind Cut) Programme Challenge - Gerald H - 09-27-2017 09:12 AM Yes, I would very much appreciate contributions in the way of programmes or algorithms. Your programme fails for input -5 3 & will have to grow to accommodate negative reals. I will certainly timely publish my programme but do not expect it to be the shortest. RE: HP 50g: Neighbour Function (Dedekind Cut) Programme Challenge - Werner - 09-27-2017 10:43 AM I created this when Joe first mentioned the NEIGHBOR function. It returns the next number larger than x=s*m*10^n Basically, if x=0, return 1e-499 elsif s*m=-1, return (s.m + 1e-12)*10^n else return (s.m + 1e-11)*10^n Code: \<< If I call this program NXT, then NEIGHBOR as defined in the 71 would be Code: \<< IF OVER < THEN +/- NXT +/- ELSE NXT END \>> RE: HP 50g: Neighbour Function (Dedekind Cut) Programme Challenge - pier4r - 09-27-2017 11:22 AM Nice input Gerald and Joe! I have a question though. From the other thread Quote:NEIGHBOR(X,Y) [nearest machine-representable number to X in the direction of Y] Wouldn't be Y representable by the system already? My doubt lies on the point that that the value given to the function is already a valid value for the system, so there is nothing to search. Would be different with a string in input rather than a number. RE: HP 50g: Neighbour Function (Dedekind Cut) Programme Challenge - Joe Horn - 09-27-2017 11:51 AM (09-27-2017 11:22 AM)pier4r Wrote: I have a question though. From the other thread Sorry, but I don't understand your question. The only thing that Y does is tell NEIGHBOR which direction to go. If Y>X, then NEIGHBOR(X,Y) returns the very next number GREATER than X which the HP-71 is capable of representing, and if Y<X then it returns the very next number LESS than X. The phrase "machine-representable number" means "limited to a 12-digit mantissa". The function has nothing to do with strings. Examples: NEIGHBOR(6,9) --> 6.00000000001 (the nearest machine-representable number above 6) NEIGHBOR(6,2) --> 5.99999999999 (the nearest machine-representable number below 6) RE: HP 50g: Neighbour Function (Dedekind Cut) Programme Challenge - Gerald H - 09-27-2017 11:53 AM Bravo Werner! I consider your contribution a complete solution & don't expect a shorter version (although "6 - 6 -" is ornate), would however be very pleased to see a more concise programme. To keep my word & amuse Joe here's my version: Edit: Corrected my programme to give correct result for zero. I have learned much from this thread, eg that .000000000001 is not the nearest representable number to zero. I doubt that, given Werner's programme, anyone will now try this programme but the wrong result irritated me. Code: :: Which does have the advantage of giving no wrong answers, ie for input 9.99999999999E499 1 Joe's returns 9.99999999999E499 & for 9.99999999999E499 9.99999999999E499 Werner's returns 9.99999999999E499 while for 9.99999999999E499 my programme errors. RE: HP 50g: Neighbour Function (Dedekind Cut) Programme Challenge - Paul Dale - 09-27-2017 11:53 AM I can't believe the 50G doesn't have this function. I'm confident it is present internally somewhere. Pauli RE: HP 50g: Neighbour Function (Dedekind Cut) Programme Challenge - Werner - 09-27-2017 12:24 PM Joe: what does NEIGHBOR return if X=Y? Gerald: (09-27-2017 11:53 AM)Gerald H Wrote: for No, it errors out, as (for now) it considers it has to go up to the next number. I guess your overflow flag is cleared, then it returns 9.99999999999e499 I'd say when X=Y the number should be returned unchanged, so: Code: \<< RE: HP 50g: Neighbour Function (Dedekind Cut) Programme Challenge - Joe Horn - 09-27-2017 01:01 PM (09-27-2017 12:24 PM)Werner Wrote: Joe: what does NEIGHBOR return if X=Y? Some interesting inputs & outputs on HP-71: NEIGHBOR(7,7) --> 7 NEIGHBOR(0,0) --> 0 NEIGHBOR(0,7) --> 0.00000000001E-499 = MINREAL (non-normalized) NEIGHBOR(1,0) --> 0.999999999999 (twelve 9's, not just eleven like my buggy program above) RE: HP 50g: Neighbour Function (Dedekind Cut) Programme Challenge - Werner - 09-27-2017 01:04 PM Thanks, Joe My program above returns correct results for all of these. The 1e-499 is normalized, though ;-) Werner RE: HP 50g: Neighbour Function (Dedekind Cut) Programme Challenge - pier4r - 09-27-2017 01:40 PM (09-27-2017 11:51 AM)Joe Horn Wrote: Sorry, but I don't understand your question. The only thing that Y does is tell NEIGHBOR which direction to go. If Y>X, then NEIGHBOR(X,Y) returns the very next number GREATER than X which the HP-71 is capable of representing, and if Y<X then it returns the very next number LESS than X. The phrase "machine-representable number" means "limited to a 12-digit mantissa". The function has nothing to do with strings. Ah, ok, then I misunderstood. I thought the right function was like 'Y' is not representable by the system, can you give the closer number to Y, starting from X, that can represent Y? RE: HP 50g: Neighbour Function (Dedekind Cut) Programme Challenge - David Hayden - 09-27-2017 03:12 PM Slow and simple, but it works. This just keeps adding or subtracting 10^n for successively larger values of n until X+10^n changes. Code: @ NEIGHBOR RE: HP 50g: Neighbour Function (Dedekind Cut) Programme Challenge - Gerald H - 09-27-2017 03:39 PM Well done, David. Gives wrong answer for input 1.E-499 6 returns 2.E-499 should be 1.00000000001E-499 RE: HP 50g: Neighbour Function (Dedekind Cut) Programme Challenge - Gerald H - 09-28-2017 10:15 AM Many thanks for the contributions, I'm very pleased with the resulting programmes. Please see http://www.hpmuseum.org/forum/thread-9180.html which will assist students greatly (I hope). |