# HP Forums

Full Version: Base Conversions (to any base 2-36)
You're currently viewing a stripped down version of our content. View the full version with proper formatting.

Introduction

The program BASEDEC converts a number in a base representation to decimal (base 10). BASEDEC accepts any positive number, including non-integers up to base 36. Each of the letters of alphabet represents a value:

A = 10
B = 11
C = 12
D = 13
E = 14
F = 15
...
Z = 35

BASEDEC takes two arguments: number to be converted, entered as a string; and the base representation of the number.

Examples:

BASEDEC("531",8) converts 531_8 to decimal. Result: 345

BASEDEC("63.95A", 11) converts 63.95A_11 to decimal. Result: 69.86701728

BASEDEC("4H", 18) converts 4H_18 to decimal. Result: 89 (H = 17)

HP Prime Program BASEDEC
Code:
``` EXPORT BASEDEC(s,b) BEGIN // string, original base // number can have fractional // part in decimal form // convert to base 10 // A=10,B=11,C=12...Z=35 // 2019-12-09 EWS LOCAL l,pt,sl,sr,ls,lr,d; LOCAL k,ac,al,dg,sd; d:=0; // decimal l:=DIM(s); // split the string pt:=INSTRING(s,"."); CASE IF pt==0 THEN  sl:=s; sr:=""; END; IF pt==1 THEN  sl:=""; sr:=RIGHT(s,l-1); END; DEFAULT sl:=LEFT(s,pt-1); sr:=RIGHT(s,l-pt); END; // conversion to decimal // integer part ls:=DIM(sl); IF ls>0 THEN FOR k FROM 1 TO ls DO sd:=MID(sl,k,1); ac:=ASC(sd); al:=ac(1); dg:=when(al>64,al-55,EXPR(sd)); d:=d+dg*b^(ls-k); END; END; // fractional part lr:=DIM(sr); IF lr>0 THEN FOR k FROM 1 TO lr DO sd:=MID(sr,k,1); ac:=ASC(sd); al:=ac(1); dg:=when(al>64,al-55,EXPR(sd)); d:=d+dg/(b^k); END; END; // return decimal RETURN d; END;```

Introduction Part II

The program DECBASE converts a number in decimal form to any base you want. DECBASE works will all positive real numbers. There are three arguments to DECBASE:

* The number in decimal form
* The desired base
* Accuracy: how many decimal points do you want. Conversions from decimal to other bases are approximations. If the number is a integer (frac(number) = 0), then this argument is ignored (put 0).

The result is returned as a string.

Examples:

DECBASE(69, 6, 0) converts 69 to base 6. Result: "153"

DECBASE(5.875, 8, 4) converts 5.875 to base 8 to four decimals. Result: "5.7000" (exact: 5.7_8)

DECBASE(635.05, 12, 12) converts 635.05 to base 12 to twelve decimals. Result: "44B.072497249724" (exact: 44B.07249..._12 (7249 repeats))

HP Prime Program DECBASE
Code:
``` EXPORT DECBASE(d,b,acc) BEGIN // decimal, base, accuracy // convert from decimal to base // 2019-12-09 EWS LOCAL n,f,nl,nd; LOCAL nf,k,dg,s,fd; n:=IP(d); // integer f:=FP(d); // fractional s:=""; // integer IF n>0 THEN nl:=IP(LOG(n)/LOG(b)); nd:=n; FOR k FROM nl DOWNTO 0  DO dg:=IP(nd/(b^k)); IF dg<10 THEN s:=s+STRING(dg); ELSE s:=s+CHAR(dg+55); END; nd:=nd-dg*b^k; END; END; // numbers < 1 IF n==0 THEN s:="0"; END; // fractional part IF f>0 THEN s:=s+"."; fd:=f; FOR k FROM 1 TO acc DO dg:=IP(fd*b^k); IF dg<10 THEN s:=s+STRING(dg); ELSE s:=s+CHAR(dg+55); END; fd:=fd-dg/(b^k); END; END; RETURN s; END;```
Nice programs!
if I run the program using Shift Program and use the fill form all is well, but if I run from home screen as
BASEDEC("531",8) I get
Code:
`0+when(al>64,al-55,EXPR(sd))*324+when(al>64,al-55,EXPR(sd))*18+when(al>64,al-55,EXPR(sd))*1`

This is on android 2.1.14346 (2019 11 21)
Wonder why the when() statements not being evaluated?
That's a strange result. Possibly a bug?

Thank you for the compliment!
Happy 2PI! (in base 26) Reference URL's
• HP Forums: https://www.hpmuseum.org/forum/index.php
• :