Seite 1 von 1

Frage zum Rechnen mit kleinen Zahlen

Verfasst: 14.04.2015 18:06
von moin
Hallo,
wie kann man mit kleinen Zahlen rechnen und sich dann die Ergebnisse anzeigen lassen? Gibt es hier einen Trick?
Beispiel: 1.23456E-23 * 3.456789E-10 =

Re: Frage zum Rechnen mit kleinen Zahlen

Verfasst: 14.04.2015 18:40
von Imhotheb
Verstehe nicht so ganz was du wissen möchtest ... aber es kommt darauf an, wie genau dein Ergebnis sein soll ... entweder Float (.f), einfache Genauigkeit, oder Double (.d), doppelte Genauigkeit, für die Variablen benutzen.
Zum umwandeln in einen String kannst du StrF(Var.f) oder StrD(Var.d) verwenden

Mehr ist in der Hilfe unter "Variablen, Typen und Operatoren" zu finden

Re: Frage zum Rechnen mit kleinen Zahlen

Verfasst: 14.04.2015 19:02
von moin
Ich habe mir jetzt ein kleines Programm geschrieben um mein Problem einzugrenzen. Ich muss da wohl einen Fehler in meiner längeren Formel haben (die ich hier nicht gepostet habe)

Hier das kleine Test-Programm (mit einem richtigen Ergebnis ;-))

a.d=1.1234*Pow(10,-120)
Debug a
a=a/Pow(10,100)
Debug a
b.d=Log10(a)
Debug b

Das Ergebnis wird mit Debug b auch richtig anzeigt. Also hat sich meine Frage eigentlich erübrigt...

Wie kann ich mir aber die Zwischenergebnisse mit "Debug a" richtig anzeigen lassen?
Geht das nur mit "Debug StrD(a,250)"? Gibt es unter Purebasic auch eine wissenschaftliche Notation?

Re: Frage zum Rechnen mit kleinen Zahlen

Verfasst: 14.04.2015 19:50
von Kiffi

Code: Alles auswählen

UseSQLiteDatabase()
OpenDatabase(0, ":memory:", "", "", #PB_Database_SQLite)
DatabaseQuery(0, "Select 1.23456E-23 * 3.456789E-10")
NextDatabaseRow(0)
Debug GetDatabaseString(0, 0)
;-)

Re: Frage zum Rechnen mit kleinen Zahlen

Verfasst: 14.04.2015 22:11
von NicTheQuick
Was hältst du davon?

Code: Alles auswählen

Procedure.s StrDEx(double.d, decimals.i = 5)
	Protected exp10.d = Log10(Abs(double))
	exp10 = Round(exp10, #PB_Round_Down)
	double * Pow(10, -exp10)
	ProcedureReturn StrD(double, decimals) + "e" + Str(exp10)
EndProcedure

a.d = 1.1234 * Pow(10,- 120)
Debug StrDEx(a)
a = a / Pow(10, 100)
Debug StrDEx(a)
b.d = Log10(a)
Debug b
Ich hab es noch nicht eingehend getestet.

Edit: Für negative Zahlen angepasst.

Re: Frage zum Rechnen mit kleinen Zahlen

Verfasst: 14.04.2015 23:13
von moin
Hallo Kiffi und NicTheQuick
das sind tolle Lösungen. Vielen Dank.

@Kiffi
Mit SQLiteDatabase habe ich noch nie gearbeitet. Könntest du vielleicht die einzelnen Zeilen etwas genauer erklären?
Welche Möglichkeiten/Vorteile bietet eine SQLiteDatabase-Lösung? Wo liegen die Grenzen/Nachteile?

@NicTheQuick
Für positive Zahlen ist diese Erweiterung super und sofort zu verstehen.
Für negative Zahlen muss die Schleife noch erweitert werden.

Re: Frage zum Rechnen mit kleinen Zahlen

Verfasst: 14.04.2015 23:27
von NicTheQuick
moin hat geschrieben:Für negative Zahlen muss die Schleife noch erweitert werden.
Stimmt, ich hab es oben korrigiert.

Re: Frage zum Rechnen mit kleinen Zahlen

Verfasst: 15.04.2015 17:17
von Kiffi
moin hat geschrieben:Mit SQLiteDatabase habe ich noch nie gearbeitet. Könntest du vielleicht die einzelnen Zeilen etwas genauer erklären?
ist eigentlich relativ simpel:

Code: Alles auswählen

UseSQLiteDatabase() ; SQLite initialisieren
OpenDatabase(0, ":memory:", "", "", #PB_Database_SQLite) ; eine temporäre Datenbank im Speicher erstellen
DatabaseQuery(0, "Select 1.23456E-23 * 3.456789E-10") ; Term berechnen
NextDatabaseRow(0) ; den Datensatz-Zeiger auf das Ergebnis der Berechnung setzen
Debug GetDatabaseString(0, 0) ; und das Ergebnis der Berechnung ausgeben
moin hat geschrieben:Welche Möglichkeiten/Vorteile bietet eine SQLiteDatabase-Lösung? Wo liegen die Grenzen/Nachteile?
SQLite hat einen eingebauten rudimentären mathematischen Parser, den man auf diese Weise nutzen kann.

Vorteil: nur 5 Zeilen Code ;-)

Nachteile:

* vermutlich wird die Performance im Vergleich zu den PureBasic Math-Befehlen eher schlecht sein.
* Wenn Du SQLite verwendest, wird Deine EXE automatisch um knapp 500 KB größer.

Ich nehme auch mal stark an, dass die Fähigkeiten des Parsers ziemlich begrenzt sind. Da bist Du mit den PB-Befehlen mit Sicherheit flexibler.

Grüße ... Peter