Mio. Nachkommastellen in andere Basis umrechnen

Anfängerfragen zum Programmieren mit PureBasic.
hyperG
Beiträge: 23
Registriert: 28.06.2014 10:43

Mio. Nachkommastellen in andere Basis umrechnen

Beitrag von hyperG »

Es gibt ja hier die UnlimitedIntegerArithmetic.dll.pbi, wo man sehr große GANZ-Zahlen berechnen kann.
Solange bei den Nachkommastellen keine Nullen auftauchen ist ja alles einfach. ABER sobald mehrere 0 hintereinander, muss man sich ein virtuelles Komma berechnen. Das wäre mit Stringlen umständlich, da pro Ziffer

Code: Alles auswählen

Laenge.s = Z_String(Ergebnis)
nötig wäre, um die virtuelle Kommastelle zu speichern/berechnen (Beispiel Dez nach Basis 16):

16 · 0,06250000000000025 = 1,000000000000004 --> Ziffer: 1
16 · 3,9968028886505635e-15 = 6,394884621840902e-14 --> Ziffer: 0
16 · 6,394884621840902e-14 = 1,0231815394945442e-12 --> Ziffer: 0
16 · 1,0231815394945442e-12 = 1,6370904631912708e-11 --> Ziffer: 0
16 · 1,6370904631912708e-11 = 2,6193447411060333e-10 --> Ziffer: 0
16 · 2,6193447411060333e-10 = 4,190951585769653e-9 --> Ziffer: 0
16 · 4,190951585769653e-9 = 6,705522537231445e-8 --> Ziffer: 0
16 · 6,705522537231445e-8 = 0,0000010728836059570312 --> Ziffer: 0
16 · 0,0000010728836059570312 = 0,0000171661376953125 --> Ziffer: 0
16 · 0,0000171661376953125 = 0,000274658203125 --> Ziffer: 0
16 · 0,000274658203125 = 0,00439453125 --> Ziffer: 0
16 · 0,00439453125 = 0,0703125 --> Ziffer: 0
16 · 0,0703125 = 1,125 --> Ziffer: 1
16 · 0,125 = 2 --> Ziffer: 2

Gibt es nicht einfachere Möglichkeiten z.B. mit log10(x) oder String-Multiplikation, da wäre auch das "vorn abschneiden" einfacher als die Subtraktion mit Mio-stelligen Zahlen.

Oder fertigen Code... kann auch andere Sprache sein.
ABER kein Spezial-Code für Basis 16, da ich auch höhere Basen benötoge!

Ich nutze bereits bc (GNU), aber der PC braucht bei mehr als 1 Mio. Stellen über 5 Stunden!
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Mio. Nachkommastellen in andere Basis umrechnen

Beitrag von STARGÅTE »

Generell liegt doch die eigentliche Zahl sowieso in einem "fremden" System vor.
Im Falle meines Includes zB im 2^32-er System, also Longs.

Von diesem System muss Z_String so oder so "schrittweise" in ein anderes System konvertieren (z.B. 10er).
Genauso gut kann hier aber auch in jedes beliebige andere System konvertiert werden, solange die Zahl noch anzeigbar ist.
Bei Buchstaben und Zahlen also 36er.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
hyperG
Beiträge: 23
Registriert: 28.06.2014 10:43

Re: Mio. Nachkommastellen in andere Basis umrechnen

Beitrag von hyperG »

Also hier Beispiel Basis 26:

Code: Alles auswählen

While (Len(strPi.s)>3)And(lCounter.l >0)
  Z_Multiply(zPi, z26)
  strErg.s=Z_String(zPi)
  lLenErg.q=Len(strErg.s)
  lAbstand.q=lLenErg.q-lLen.q
  If lAbstand.q <1
    strNK.s=RSet("", 1-lAbstand.q, "A") 
    lLen.q=lLenErg.q
    lCounter.l =lCounter.l + lAbstand.q -1
  Else
    strNK.s=Left(strErg.s,lAbstand.q)
    strNK.s=Chr(Val(strNK.s)+65)
    lCounter.l =lCounter.l-1
    strPi.s =Mid(strErg.s,lAbstand.q+1)
    lLen.q=Len(strPi.s)    
    While Left(strPi.s,1)="0"
      strPi.s =Mid(strPi.s,2) ;  lCounter.l =lCounter.l-1
    Wend
    Z_Number(zPi,strPi.s)
  EndIf
  WriteString(0, strNK.s)
Wend


a) Bei Nachkommastelle 1170 tauchen 2 Nullen auf (lAbstand.q =-1) und ab da wird es falsch.

b) Außerdem könnte man viel optimieren, wenn nicht die Hin- & Herumwandlungen wären...

Änderung:
a) behoben:
If lAbstand.q <1
strNK.s="A"
lCounter.l =lCounter.l -1
lLen.q=lLenErg.q -lAbstand.q
Else

b) noch offen...

13.02.2015: Referenz ist Code per c++: 8 Mio Dezimalkommastellen von Basis 10 nach Basis 30 in unter 3,8 Stunden
Antworten