Frage zum Rechnen mit kleinen Zahlen

Für allgemeine Fragen zur Programmierung mit PureBasic.
moin
Beiträge: 59
Registriert: 03.07.2007 08:38
Wohnort: Norddeutschland

Frage zum Rechnen mit kleinen Zahlen

Beitrag 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 =
Benutzeravatar
Imhotheb
Beiträge: 192
Registriert: 10.10.2014 13:14
Computerausstattung: Intel 8086, 640 KB RAM, Hercules Video Adapter, 2 x 5 1/4" 360kb Floppy, MS-DOS 3
Wohnort: Wolfenbüttel

Re: Frage zum Rechnen mit kleinen Zahlen

Beitrag 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
weil einfach einfach einfach ist ... mach' ich es anders
moin
Beiträge: 59
Registriert: 03.07.2007 08:38
Wohnort: Norddeutschland

Re: Frage zum Rechnen mit kleinen Zahlen

Beitrag 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?
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Frage zum Rechnen mit kleinen Zahlen

Beitrag 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)
;-)
a²+b²=mc²
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Frage zum Rechnen mit kleinen Zahlen

Beitrag 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.
moin
Beiträge: 59
Registriert: 03.07.2007 08:38
Wohnort: Norddeutschland

Re: Frage zum Rechnen mit kleinen Zahlen

Beitrag 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.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Frage zum Rechnen mit kleinen Zahlen

Beitrag von NicTheQuick »

moin hat geschrieben:Für negative Zahlen muss die Schleife noch erweitert werden.
Stimmt, ich hab es oben korrigiert.
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Frage zum Rechnen mit kleinen Zahlen

Beitrag 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
a²+b²=mc²
Antworten