FB18 - Das Forum für Informatik

fb18.de / Diplom Informatik / Unterbereich Grundstudium / Technische Informatik

möglichst kleinen wert elegant in float, double und long double bekommen

möglichst kleinen wert elegant in float, double und long double bekommen 2005-01-18 14:50
Vollkorn
Hallo,

ich habe mit meinem Newton-Raphson-Verfahren bei einigen Zahlen das Problem, dass es nicht terminiert.
Also wollte ich statt eines Vergleiches ob die zuletzt und aktuell berechnete Schätzung gleich sind lieber die Differenz bilden und wenn die Differenz unterhalb eines "Grenzwertes" ist die Schleife beenden.

Das Problem ist nur:
Wie bekomme ich zum Beispiel die kleinste positive Zahl in einen single oder double float hinein ohne lange von integer in float umzurechnen und dann so lange auf dem Wert herumdividieren oder dergleichen zu müssen bis ich meine 1*10^-wasauchimmer darin stehen habe?

schönen Nachmittag
Jan

Re: möglichst kleinen wert elegant in float, double und long double bekommen 2005-01-18 15:20
MoKrates
Hm?

Du kannst doch zB:

Grenzwert=1E-20; // 1 * 10 ^ - 20

schreiben.
C versteht das, denke ich… *nachguck*.. Jupp, tut es. Und wenn C das versteht, kannste davon ausgehen, dass auch Java, Scheme, Pascal, oder worin Du sonst so programmierst das verstehen. Versuchs einfach mal. C++ enthaelt C uebrigens vollstaendig bis auf ein bis zwei Spezialfaelle, darum versteht auch C++ das.

Mo

Re: möglichst kleinen wert elegant in float, double und long double bekommen 2005-01-19 19:39
low_level
Das Problem ist nur:
Wie bekomme ich zum Beispiel die kleinste positive Zahl in einen single oder double float hinein ohne lange von integer in float umzurechnen und dann so lange auf dem Wert herumdividieren oder dergleichen zu müssen bis ich meine 1*10^-wasauchimmer darin stehen habe?

Erstmal solltest Du bei Fließkommaoperationen sehr, sehr vorsichtig sein. Es können jede Menge Rundungsfehler auftreten.

Der kleinste Wert einer double-Variablen (im Format IEEE-754-1985) ist [img]http://mokrates.de/cgi-bin/texstring?%20%5Cpm%201%7B%2C%7D0%5Ccdot2%5E%7B-1074%7D%20[/img]. In Java ist das die Konstante [tt] java.lang.Double.MIN_VALUE. [/tt]

Eine geeignete Möglichkeit, zwei Fließkommazahlen auf Ähnlichkeit zu überprüfen, könnte sein:

boolean isSimilar(double a, double b) { return (Math.abs(a / b - 1.0) < 1.0e-10); }

Re: möglichst kleinen wert elegant in float, double und long double bekommen 2005-01-19 19:59
low_level
In den Sprachen C und C++ solltest Du dir die Datei /usr/include/float.h mal ansehen. Da stehen die Konstanten FLT_MIN, DBL_MIN und (eventuell) LDBL_MIN drin.

Allerdings sind das bei mir (i386, NetBSD 1.6) die kleinsten "normalen" Zahlen (siehe IEEE-754), also mit einem Exponenten ungleich 0.

#include <float.h> #include <stdio.h> static void print_hex(const unsigned char *data, size_t datasize) { size_t i; for (i = 0; i < datasize; i++) { if (i != 0) putchar(' '); printf("%02x", data[datasize - 1 - i]); /* auf Big-Endian-Maschinen data[i] */ } putchar('\n'); } int main(void) { float f = FLT_MIN; double d = DBL_MIN; long double ld = LDBL_MIN; print_hex((const unsigned char *) (&f), sizeof(f)); print_hex((const unsigned char *) (&d), sizeof(d)); print_hex((const unsigned char *) (&ld), sizeof(ld)); return 0; }

Re: möglichst kleinen wert elegant in float, double und long double bekommen 2005-01-21 02:59
Anonymer User
Hi,
danke für eure Tipps, aber ich vergas ein kleines Detail zu erwähnen: Es geht um Assembler auf der Sparc… ;)

Naja, ich habe jetzt das Problem vorerst gelöst indem ich in meiner in C geschriebenen Main-Methode der Assembler-Methode einen Wert als Parameter übergeben habe.

Jan