Seite 1 von 1

Mio. Nachkommastellen in andere Basis umrechnen

Verfasst: 03.02.2015 23:46
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!

Re: Mio. Nachkommastellen in andere Basis umrechnen

Verfasst: 04.02.2015 00:11
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.

Re: Mio. Nachkommastellen in andere Basis umrechnen

Verfasst: 04.02.2015 20:53
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