Wertebereich von Variablen
-
sega schrieb:
Nach der Operation hat f immer noch den Wert 1.
Das ist natürlich ziemlich ungünstig.Kann es eventuell sein, dass die Variable eigentlich einen genaueren Wert enthält, und nur bei der printf-Ausgabe gerundet wird? Double sollte üblicherweise schon genau genug dafür sein.
Grundsätzlich kann man derartige Rundungsfehler nicht vermeiden, wenn man mit den normalen Fließkommatypen rechnet.
whois schrieb:
So etwas wie das "1.308997e-010" ist kein zulässiger Dezimal wert !
Wieso denn nicht?
-
Hi
Wieso schon ?
Du kannst nicht einer Variable, einen exponential Wert zuweisen.
lowbyte
-
lowbyte_ schrieb:
Du kannst nicht einer Variable, einen exponential Wert zuweisen.
Wieso denn nicht?
-
sega schrieb:
Wie kann ich diesen (Rundungs-)Fehler minimieren, oder ganz abstellen?
Mehr Stellen anzeigen bei der Ausgabe. Ich würde vermuten, daß er ganz richtig gerechnet hat, aber Du es nicht siehst.
-
Hi
Ja und wie wird das intern dargestellt ?
lowbyte
-
lowbyte_ schrieb:
Ja und wie wird das intern dargestellt ?
Genauso wie immer?
-
lowbyte_ schrieb:
Ja und wie wird das intern dargestellt ?
Ungefähr so: http://en.wikipedia.org/wiki/Floating_point
-
Hi
Habe eigentlich ganz was anders gemeint.
So wie es aussieht musst du einfach mehr zeichen nach dem komma angeben.
printf("%.15f", var);
lowbyte
-
lowbyte_ schrieb:
Habe eigentlich ganz was anders gemeint.
Was denn?
-
Hi
Ich meinte soeine Zahl in ein double. 19 Stellen soweit ich mich erinnere.
hab auch nicht genau hingeschaut. sorrylowbyte
-
lowbyte_ schrieb:
19 Stellen soweit ich mich erinnere.
Das hängt wohl von deiner Fliesskommadarstellung und von der Zahl ab. Bei double sollten es mindestens 10 sein. Genauere Auskunft gibt *_DIG in float.h.
-
Hi
Ja das ist natürlich richtig.
Lowbyte
-
Die Ausgabe erfolgt schon mit %e, es müssten also alle Stellen und der Exponent ausgegeben werden ...
Ergebnis ist exakt 1.0000000e000
-
sega schrieb:
Die Ausgabe erfolgt schon mit %e, es müssten also alle Stellen und der Exponent ausgegeben werden ...
Ergebnis ist exakt 1.0000000e000
Wieviel ist DBL_DIG?
-
Folgendes Programm zB:
#include <stdio.h> #include <float.h> // o wie schlau ist die syntax-hervorhebung int main(void) { double f; double x = 1.308997e-010; f = 1 - x; printf("%d\n%.20lf\n%.20lf\n", DBL_DIG, x, f); return 0; }
Gibt auf meinem System aus:
15 0.00000000013089970000 0.99999999986910026450
-
Das
%.20lf
war etwas ungenau, denn in C99 hat dasl
no effect on a following a, A, e, E, f, F, g, or G conversion specifier. Es ginge genauso auch%.20e
.
-
mngbd schrieb:
Wieviel ist DBL_DIG?
Kein Ahnung, wie kriege ich das raus?
-
sega schrieb:
Kein Ahnung, wie kriege ich das raus?
Versucht, mein Testprogramm auszuführen?
-
Hi
Bitte frag doch mal eine Suchmaschine.
Und führe mal den code aus von "mngbd".
Was hast du den für ein Compiler ?lowbyte
-
Ich benutze den Visual Studio Professional 2010 RC.
Es lag natürlich am Wertebereich.
Was ich euch verschwiegen hatte war die Tatsache, dass sich der Wert für X innerhalb meines Programms auch noch verändert.
Mir ist allerdings nicht aufgefallen, dass es sehr schnell in Richtung 1e-27 ging.
Da hatte ich es noch in der Größenordnung 1e-10 vermutet.
Das von 1 abzuziehen läuft natürlich nicht ...Danke Euch!