bei 1.) ist das Ergebnis 4, bei 2.) 8
1.) a = 2 ^ Fix(Log(8) / Log(2))
2.) b = Fix(Log(8) / Log(2))
a = 2 ^ b
1.) a = 2 ^ Fix(Log(8) / Log(2))
2.) b = Fix(Log(8) / Log(2))
a = 2 ^ b
sowohl in der Tabelle wie auch im Direktfenster erscheint bei mir das korrekte Ergebnis
b = Fix(Log(8) / Log(2)) = 3
Gruss Rainer
warum ein neuer Beitrag. Die Übersicht geht dadurch verloren.
Das keiner mehr geantwortet hat liegt wohl auch daran das keiner eine Antwort hat. Selbst Rainer konnte keinen Grund finden. Ich hatte mich ein wenig verlaufen da ich gedacht habe es handelt sich um Formeln in der Tabelle. Mir ist nur aufgefallen wird auf Int verzichtet kommt bei beiden das gleiche Ergebnis raus. Einen Grund für die Unterschiedlichen Egebnisse habe ich leider auch nicht. Obwohl es logisch ist das bei beiden das gleiche Ergebnis rauskonmmen müßte.
Gruß Hajo
Gruß Wolfgang
scheinbar schwieriger Fall, aber lösbar. Ich will versuchen, es zu erklären:
Schaut man sich das Konstrukt Fix(Log (8) / Log(0)) an, so stellt man fest, dass es die Fix-Fkt. schwer hat: Bei Log(0) wird der Ganzzahl-Anteil vor der Division 0! Das geht dann schief ... Da also diese innere Klammer unter der Fix-Fkt. einen Fehler ergäbe (DIV/0!), gibt Fix den Wert 2 (Log(8)) zurück - 2^2 = 4. Die Teilung von Log(8) / Log(2) ergibt mathematisch korrekt 3, also 2^3=8.
Nun darf man nicht zu hart mit der Fix-Fkt. richten, denn in der Hilfe (zu Fkt. allg.) findet man den Hinweis, Funktionen mit *Werten* rechnen zu lassen (ja, auch ByVal gehört dazu). Also: 2 ^ Fix([Log(8) / Log(2)]) = 8. (eckige Klammer!)
Noch einen schönen 2. Advent und einen Dank an all jene, die hier Ihre Zeit opfern - MfG Mario
Was haste denn für a, b vereinbart?
Wenn Dim a as Integer, denn stimmts auch...
Gruß HW
Vielen Dank für die Erklärung.
Die ist soweit logisch, wenn 0 eingesetzt wird.
Aber die Funktion FIX() sollte doch den Ganzzahligen Wert aus der Division LOG(8)/LOG(2) ( = 0.903089987/0.301029996
) zurückgeben.
Wenn ich deiner Erklärung folge, dürfte dann noch nicht mal 4 herauskommen, da der LOG(8) = 0.903089987 und mit der Funktion FIX() der Ganzzahlige Anteil doch eigentlich 0 ist.
Das Ergebnis der gesamten Berechnung müsste demnach 0 sein.
2^0 = 0.
Warum bei dieser Formel in EXCEL allerdings 1 herauskommt, kapiere ich momentan noch nicht :-)
Sollte ich da war falsch verstanden haben, würde ich mich freuen nochmals eine Erklärung zu erhalten.
Herzliche Grüsse
Rainer
folgende Ausgangsbasis (Für VBA!!):
Die Fkt. Log(x) berechnet den *natürlichen* Logarithmus einer Zahl x zur Basis e (Eulersche Zahl); also Excel-Log(8) = (Math-ln(8) = 2,07944154167984.
Der von Dir genannte Wert ist der dekadische Logarithmus (Basis 10). Wenn Du den brauchst, musst Du eine auf dem ln(x) aufbauende Fkt. benutzen: Logn(x) = Log(x) / Log(n) (Erklärung: Den Logarithmus zur Basis n für jede Zahl x kann man berechnen, indem man den natürlichen Logarithmus von x durch den natürlichen Logarithmus von n dividiert). Also:
Static Function Log10(X) ' dek. Log. ermitteln
Log10 = Log(X) / Log(10#)
End Function
Noch ein Sachverhalt: 2^0 ist per definitionem = 1. (Man denke an das LSB!)
Für Formeln innerhalb Excel sieht es etwas anders aus:
Hier stehen die Fkt. Log(x) = dek. Log. sowie Ln(x) = nat. Log. direkt zur Verfügung. Allerdings rechnet Excel sehr wohl exakt: Log(8) / Log(2) = 3. Das Fix-Problem mit DIV/0 ist aber gleichbleibend (immer dann, wenn die PPS-Regel gilt: Potenz vor Punkt vor Strich), also 2^Fix(Log(8) / Log(2)) ). Hier muss dann doppelt geklammert werden.
MfG Mario
bei 1.) ist das Ergebnis 4, also falsch
bei 2.) ist das Ergebnis 8, also richtig
1.) a = 2 ^ Fix(Log(8) / Log(2))
2.) b = Fix(Log(8) / Log(2))
a = 2 ^ b
dazu: Wer lesen kann, ist eindeutig im Vorteil!
Zu Deinem Problem habe ich gestern Abend Ursache und Abhilfe gepostet: Bei Kettenrechnungen á la 2 ^ Fix(Log(8) / Log(2))
muss Excel angewiesen werden, den inneren Term zuerst zu lösen, da hier die PPS-Regel gilt, also muss der Term, welcher der Fix-Fkt. übergeben wird (Log(8) / Log(2) in Werteklammern gesetzt werden (a = 2 ^ Fix([Log(8) / Log(2)]) ), damit das Ergebnis dieses Terms von der Fkt. ausgewertet wird. Und, wie auch bereits gepostet, unter VBA ist Log(8) / Log(2) = 2,07944154167984 / 0,693147180559945 = 3; also Fix(3).
Wird nicht geklammert, dann kann die Fix-Fkt. nur von Log(8) den ganzz. Anteil bestimmen, um DIV/0 zu vermeiden, also Fix(2,07944154167984) = 2.
MfG Mario
Soviel zum Thema
ich kann Deiner Argumentation nicht so folgen. log(0) ist nicht definert (-unendlich). Der Versuch ein log(0) zu berechnen führt in einen Laufzeitfehler. Was soll VBA da interpretieren, das wäre das erstemal ;-). Insbesondere wo ist da der Bezug zur Problemaufgabe?
Das Problem schein mir ehr das zu sein, dass hier in einem bunten Mix Double, Integer Funktionen gemischt werden. Fix ist da besondern kritisch. Da fehlt bei dem Double-Wert, den die Log-Fkt zurückliefert evtl. e weng was und das wird gleich auf den Stack geschoben - Fix Peng...
Wenn man nämlich a als Integer definiert, erhält man auch das richtige Ergebnis.
Sag doch noch mal zu deinen Werteklammern, wo genau steht da was in der OH...
Gruß HW
auch hier kann ich nur sagen: Wer lesen kann, ist klar im Vorteil!
Von Log(0) war im gesamten Thread nicht die Rede, sondern vom Ergebnis Fix(Log(8)/Log(x)) bei x =2. Was die Argumentation des Type-Mismatches angeht, so ist diese hier völlig fehl am Platze. Funktionen arbeiten grundsätzlich auf dem Stack, dabei wird stets die 'richtige' - sprich genaueste Type genutzt. Die Rückgabe an eine Variable ist hier ebenfalls irrelevant, da der bereits falsch ermittelte Wert übergeben wird.
Und was die Aussage betrifft: [Zitat] ... "Wenn man nämlich a als Integer definiert, erhält man auch das richtige Ergebnis." ...
Leider falsch:
a = 2 ^ Fix(Log(8) / Log(2)) = 3
Richtig ist:
a = 2 ^ Fix([Log(8) / Log(2)]) = 8
Als Literatur empfehle ich:
T. Ottmann/P. Widmayer Algorithmen und Datenstrukturen BI Wissenschaftsverlag 3-411-03161-1 1990
MfG Mario
Korrektur des Zitatblockes:
Und was die Aussage betrifft: [Zitat] ... "Wenn man nämlich a als Integer definiert, erhält man auch das richtige Ergebnis." ...
Leider falsch:
a = 2 ^ Fix(Log(8) / Log(2)) = 4 (vier)
MfG Mario
[Zitat]
https://www.herber.de/forum/messages/190533.html
Schaut man sich das Konstrukt Fix(Log (8) / Log(0)) an, so stellt man fest, dass es die Fix-Fkt. schwer hat: Bei Log(0) wird der Ganzzahl-Anteil vor der Division 0! Das geht dann schief ...
[/Zitat]
Wenn das schwarze, wie üblich die Buchstaben sind, komm ich damit nicht zurecht?
Vielleicht kannst Du mir das nochmal ausdeutschen, sonst muß tatsächlich den Ottmann/Widmayer lesen :-)...
Gruß HW