Σάββατο, 9 Απριλίου 2016

Διαίρεση με μεγάλο αριθμητή. (ενημερώθηκε)


Η συνάρτηση ProDiv$() χειρίζεται μεγάλο ακέραιο >=0 αριθμητή και κανονικό ακέραιο >0 παρονομαστή και δίνει σε επιστημονική γραφή όλα τα νούμερα, με επιλογή αν θέλουμε δεκαδικά επιπλέον. Επειδή στην επιστημονική γραφή, όλος ο αριθμός φαίνεται σαν δεκαδικός, όταν δίνουμε τον αριθμό δεκαδικών προσθέτει "0" όσα και τα νούμερα για τα δεκαδικά αλλά στο τέλος έχει κανονική ένδειξη Ε. Η εξαγωγή της είναι το αλφαριθμητικό με όλα τα νούμερα.

(ενημερώθηκε ο κώδικας)

Function ProDiv$ {
      Read a$, b$, pp
      Let v$="", gg=len(b$), p=pp, mm=0
      {
            s=len(b$)
            c$=left$(a$,s)
            if c$<b$ then s++: c$=left$(a$, s) : if s=len(b$) then exit
            d1=val(c$) div val(b$)
            if gg<s-1 then {
                  if v$="0" then mm=-s+gg
                  v$=v$+string$("0",s-1-gg)
            }
            v$=v$+str$(d1,"0")
            r$=str$(val(c$)-val(b$)*d1,"0")
            gg=len(r$)
            a$ =r$+mid$(a$,s+1)
            cc=false
            if len(a$)=len(b$) then {
                  if a$>b$ then cc=true
            }  else cc=len(a$)>len(b$) and a$<>"0"
            if cc else if p=0 then exit
            if p>0 and not cc then {
                  mm=len(v$)+1
                  a$=a$+string$("0",p) : p=0
            }
            loop
      }
      \\ scientific notation
      if mm<>0 then {
            if mm>1 then {
                  =Left$(v$,1)+"."+mid$(v$,2,mm-2)+mid$(v$,mm+1)+"E+"+str$(mm-2,"00")
            } else.if mm<0 then {
                  =Mid$(v$,-mm+1,1)+"."+Mid$(v$,-mm+2)+"E-"+str$(abs(mm),"00")
            }
      } else {
            mm=len(v$)
            if mm>1 then {
              =Left$(v$,1)+"."+mid$(v$,2)+"E+"+str$(mm-1,"00")
            } else =V$
      }
}
Def ExpStr$(x)= str$(X,"0.00000000000000000E-00")
Form 80,50
a$="57645834674367349573945793457359374512154545412313137868768787874738942834756234896582946937658926582565"
b$="3224241711"
Report 2,"Calculation for "+a$+"/"+b$
Report 2, ExpStr$(val(a$)/val(b$))
Print
Report "Expanded:"
Report 2, ProDiv$(a$, b$, 100)
a$="1"
b$="3224241711"
Print
Report 2,"Calculation for "+a$+"/"+b$
Report 2, ExpStr$(val(a$)/val(b$))
Print
Report "Expanded:"
Report 2, ProDiv$(a$, b$, 100)