Vorkomma-Stellen berechnen



  • Und zwar habe ich ein Problem.
    Ich habe Potenzen. Beispielsweise 2^567 oder 3^1000
    Nun wüsste ich gerne wie viele Stellen die errechnete Dezimal-Zahl vor dem Komma hat. Die eigentliche Zahl interessiert mich erstmal nicht.
    Die Zahlen gehen so glatt auf. Also haben immer xxx,0.
    Soll aber auch andersrum funktionieren also 0,xxx

    Dazu habe ich mir überlegt das umzurechnen.
    In x * 10^stellen

    Leider weiß ich nicht wie das geht.
    Wenn es sehr leicht ist, könnte mir vllt jemand die Formel dafür hier rein schreiben.
    Wenn es was Komplexer ist, wäre ich für einen Suchbegriff dankbar.
    Weil "stellen vor dem komma berechnen" bringt bei google absolut nichts.

    Danke schon mal
    Sqwan



  • 264==(10ln(2))64==10(ln(2)*64)



  • 2 ^ 64 = 18446744073709551616 macht 20 stellen
    10 ^ (ln(2) * 64) = 2,298367944215133689912096908597e+44

    geht also leider nicht auf.

    Da fällt mir dann auch ein:
    Wenn der rechner aus 2^567 keine zahl machen kann,
    kann er auch aus 10 ^ iwas keine machen.

    Gibt es da vllt über diese Ln geschichte eine möglichkeit direkt nur die stellen heraus zu bekommen?



  • Sorry, statt ln meinte ich den Logarithmus zur Basis 10.


  • Mod

    Allgemein: Anzahl Stellen der Zahl x im b-adischen System (negative Stellenzahl: Nachkommastellen):
    floor(log_b(x))+1

    Angewendet auf eine Zahl x^y:
    log_b(x^y) = y * log_b(x)

    Bei dir ist b=10.



  • 2 ^ 64 = 18446744073709551616 macht 20 stellen
    10 ^ (lg(2) * 64) = (hoffentlich auch)
    10 ^ (lg(2) * 64)
    10 ^ (ln(2)/ln(10) * 64) = 10 ^ 19.26591972

    Juhu!
    Macht 10^0.26591972 * 10^19
    Macht 1.84467... * 10000000000000000000



  • Sqwan schrieb:

    Wenn der rechner aus 2^567 keine zahl machen kann,
    kann er auch aus 10 ^ iwas keine machen.

    der Rechner kann das schon, nur nicht in jeder Programmiersprache 🙂

    (2 raisedToInteger: 567) printString size. 
    171
    
    (3 raisedToInteger: 1000) printString size.  
    478
    


  • volkard schrieb:

    2 ^ 64 = 18446744073709551616 macht 20 stellen
    10 ^ (lg(2) * 64) = (hoffentlich auch)
    10 ^ (lg(2) * 64)
    10 ^ (ln(2)/ln(10) * 64) = 10 ^ 19.26591972

    Juhu!
    Macht 10^0.26591972 * 10^19
    Macht 1.84467... * 10000000000000000000

    wo kommt das "10^0.26591972" her?
    Funktioniert auch soweit. Da ich nur die Stellen brauche.
    macht dann für 2^567 = 170,68400754147733768618995330879 stellen.
    Rund also 170. Plus die Stelle die immer davor ist sind das 171 stellen.
    jetzt frag ich mich, wieso das auch bei ln(3)/ln(10) geht.
    Der ln is doch zur basis e und nicht 2 oder 3?

    zum Beispiel schrieb:

    Sqwan schrieb:

    Wenn der rechner aus 2^567 keine zahl machen kann,
    kann er auch aus 10 ^ iwas keine machen.

    der Rechner kann das schon, nur nicht in jeder Programmiersprache 🙂

    (2 raisedToInteger: 567) printString size. 
    171
    
    (3 raisedToInteger: 1000) printString size.  
    478
    

    Okay... Ich meine mein Taschenrechner kanns nicht.
    Wenn ich das da eingabe kommt "Math ERROR".

    Das untere verstehe ich nicht. Das gibt halt an wie viele stellen eine Potenz hat. Aber in welcher Sprache? In was überhaupt.
    Die ganzen 171 ziffern gibt er aber nicht aus.
    Und so ohne weiteres kann es glaube ich garkeine Programmiersprache.
    So ein Double hat ja auch nur eine sehr begrenzte genauigkeit.
    Klar, kann man in teilaufgaben zerlegen und und und.
    Aber ich meine ganz primitiv gehts meine ich nicht.



  • Sqwan schrieb:

    wo kommt das "10^0.26591972" her?

    10^(a+b) == 10^a * 10^b
    10^(19.27) == 10^(0.27+19) == ...
    Kleiner Trick, um auch an die führenden Stellen zu kommen.



  • Sqwan schrieb:

    Die ganzen 171 ziffern gibt er aber nicht aus.
    Und so ohne weiteres kann es glaube ich garkeine Programmiersprache.

    Transcript show: (2 raisedToInteger: 567). 
    483067190377157293086918986366498418037365916213304374832154406431439892786195053067024220822740322245307952003937772147170634832630373456967863584183385093587122601852928
    
    Transcript show: (3 raisedToInteger: 1000).
    1322070819480806636890455259752144365965422032752148167664920368226828597346704899540778313850608061963909777696872582355950954582100618911865342725257953674027620225198320803878014774228964841274390400117588618041128947815623094438061566173054086674490506178125480344405547054397038895817465368254916136220830268563778582290228416398307887896918556404084898937609373242171846359938695516765018940588109060426089671438864102814350385648747165832010614366132173102768902855220001
    


  • sorry für die lange Zeile



  • zum Beispiel schrieb:

    Sqwan schrieb:

    Die ganzen 171 ziffern gibt er aber nicht aus.
    Und so ohne weiteres kann es glaube ich garkeine Programmiersprache.

    Transcript show: (2 raisedToInteger: 567). 
    4830671903771572930869189863664984180373659162[...]
    
    Transcript show: (3 raisedToInteger: 1000).
    13220708194808066368904552597521443659654220327521481[...]
    

    Verrätst du uns auch womit du das machst?

    So... Dann habe ich das System denke ich verstanden.
    Für den nächsten mal ausführlich:

    Stellen von 2^567

    10 ^ ( ln(2)/ln(10) * 567 ) 
    <=> 10 ^ (0,301 * 567)
    <=> 10 ^ (170,667)
    <=> 10 ^ (170 + 0,667)
    <=> 10 ^ (0,667) * 10^170
    <=> 4,645 * 10 ^ 170
    
    Sind dann 171 Stellen.
    

    Gleiches mit 3^1000

    10 ^ ( ln(3)/ln(10) * 1000 )
    <=> 10 ^ (0,477121 * 1000)
    <=> 10 ^ (477,121)
    <=> 10 ^ (477 + 0,121)
    <=> 10 ^ (0,121) * 10^477
    <=> 1,321 * 10^477
    
    Sind dann 478 Stellen.
    

    So. Wenn das so richtig ist habe ichs verstanden.

    Was mich dann noch interessieren würde ist, wieso das mit ln geht.
    Der ln ist ja normal zur basis e.
    ^^ Außerdem so ganz nebenbei und ein bischen ab vom thema, wann man => schreibt und wann <=>


  • Mod

    Sqwan schrieb:

    zum Beispiel schrieb:

    Transcript show: (2 raisedToInteger: 567). 
    4830671903771572930869189863664984180373659162[...]
    
    Transcript show: (3 raisedToInteger: 1000).
    13220708194808066368904552597521443659654220327521481[...]
    

    Verrätst du uns auch womit du das machst?

    Die Programmiersprache heißt Smalltalk. Das gleiche geht aber auch in Sprachen wie Haskell, Python, Lisp, Ruby und anderen. Etwas besonderes ist das heute nicht mehr (trotzdem interessant, natürlich).



  • Christoph schrieb:

    Sqwan schrieb:

    zum Beispiel schrieb:

    Transcript show: (2 raisedToInteger: 567). 
    4830671903771572930869189863664984180373659162[...]
    
    Transcript show: (3 raisedToInteger: 1000).
    13220708194808066368904552597521443659654220327521481[...]
    

    Verrätst du uns auch womit du das machst?

    Die Programmiersprache heißt Smalltalk. Das gleiche geht aber auch in Sprachen wie Haskell, Python, Lisp, Ruby und anderen. Etwas besonderes ist das heute nicht mehr (trotzdem interessant, natürlich).

    Mathematica ist sogar spezialisiert darauf, praktisch alle Rechnungen mit beliebiger Genauigkeit auszuführen. (3^1293812 wird mir praktisch instantan angezeigt - das paste ich jetzt aber nicht.)

    Für beliebig große Potenzen kann man auch ganz schnell selbst einen (wahrscheinlich relativ ineffizienten) Algorithmus in jeder Sprache schreiben, wenn man einfach Strings und die schriftliche Multiplikation wie man sie in der Grundschule gelernt hat verwendet.



  • schon, aber können Haskell / Python / LISP / Ruby auch das da?

    (Complex real: 2 imaginary: 1) reciprocal. 
    (2/5) - (1/5) i
    
    1/2 raisedToInteger: 16. 
    (1/65536)
    


  • Kann irgend eine dieser sprachen mir sagen, wann ich => verwenden muss und wann <=>

    Oder warum das mit dem LN geht, der doch zur basis e ist?!


  • Mod

    Sqwan schrieb:

    Kann irgend eine dieser sprachen mir sagen, wann ich => verwenden muss und wann <=>

    A => B bedeutet "Aus A folgt B".
    A <=> B bedeutet "(Aus A folgt 😎 und (aus B folgt A)".

    Man kann also schreiben:
    Es regnet => Die Straße ist nass.
    Aber nicht:
    Es regnet <=> Die Straße ist nass,
    denn aus "die Straße ist nass" folgt nicht "es regnet".

    Es ergibt auch keinen Sinn zu schreiben:
    2 <=> 1+1
    weil "aus 2 folgt 1+1 und aus 1+1 folgt 2" keine sinnvolle Aussage ist. Sinnvoll wäre dagegen:
    2=1+1 <=> 1+1=2

    Was du aber in deinem Post wahrscheinlich schreiben möchtest, sind einfache Gleichheitszeichen.

    Sqwan schrieb:

    Oder warum das mit dem LN geht, der doch zur basis e ist?!

    Der 10er-Logarithmus unterscheidet sich vom natürlichen Logarithmus nur um einen konstanten Faktor. Es gilt: log_10(a) = ln(a) / ln(10).
    Dabei ist es sogar egal, ob auf der rechten Seite der Gleichung ln oder irgendein anderer Logarithmus steht, das gilt immer.

    zum Beispiel schrieb:

    schon, aber können Haskell / Python / LISP / Ruby auch das da?

    (Complex real: 2 imaginary: 1) reciprocal. 
    (2/5) - (1/5) i
    
    1/2 raisedToInteger: 16. 
    (1/65536)
    

    Haskell kennt von Haus aus rationale Zahlen beliebiger Genauigkeit und komplexe Zahlen. Allerdings kann man die vorgegebenen komplexen und rationalen Zahlen nicht kombinieren, soweit ich weiß, dein erstes Beispiel würde also nur mit floating point gehen. Es dürfte aber nicht schwer sein, das richtig zu implementieren. Vielleicht gibt es dafür auch schon eine Library.



  • Naja... Ich meine in der Uni schreiben wir oft sowas in der art:

    0 = x^2 - 9 | +9
    => 9 = x^2 | wurzel()
    => x1 = 3
    => x2 = -3

    Ab und zu haben wir statt => auch <=>
    Das ist erstaunlich selten, weshalb ich nie verstanden habe, wann man es verwendet



  • In Pfeilrichtubng ist der Schluß immer richtig.

    0 = x^2 - 9
    <=>
    9 = x^2
    <=
    x = 3

    (Also aus x = 3 kann man 0 = x^2 - 9 machen, aber aus 0 = x^2 - 9 kann man nicht x = 3 machen.)

    Oft dürfte man zwar <=> schreiben, weil der Schluß in beide Richtungen richtig ist, man braucht aber nur =>.



  • in so einem Fall schreibt man dann "oBdA" ~ "ohne Bedenken des Autors" 😃


Log in to reply