Rechenprogramm liefert "machmal" falsche Werte
-
@Sarkast sagte in Rechenprogramm liefert "machmal" falsche Werte:
das 0.25 von 365,25 wird an irgendeiner Stelle gekappt
Nein. Hör bitte endlich auf Deinen Schwachfug zu verbreiten.
@Sarkast sagte in Rechenprogramm liefert "machmal" falsche Werte:
auf double umgebrochen wird
Nein.
@Sarkast sagte in Rechenprogramm liefert "machmal" falsche Werte:
wie cout das handhabt.
Wie behandelt!?
Was (zum Teufel) verstehst Du bei "nicht repräsentierbar" nicht?@Sarkast sagte in Rechenprogramm liefert "machmal" falsche Werte:
Erklärs besser als ich oder liefere dem OP eine bessere Erklärung, zumindest, wie er das pragmatisch zukünftig vermeiden kann.
Da gibt es keine Lösung à la one kind fits all. Das hängt vom Wertebereich ab.
@Sarkast sagte in Rechenprogramm liefert "machmal" falsche Werte:
Erklärs besser als ich
Sorry, aber alles was Du bisher tust ist blöd rumraten.
-
@Sarkast sagte in Rechenprogramm liefert "machmal" falsche Werte:
%f
Warum schreibst Du da
float
hin wenns eindouble
ist?
-
@Swordfish Komisch, du torpedierst einfach mögliche Antworten, ohne sie faktisch widerlegen zu können, hilft dem OP nix.
Ich würde ausnüchtern empfehlen, mir ist das für die fortgeschrittene Stunde zu blöd.
-
@Sarkast Das sind keine Antworten. Und es wäre ... ähm. freundlich von Dir mir nicht ständig Alkoholismus zu unterstellen. Darauf bin ich allergisch. Beantworte lieber die Gegenfragen.
-
Ok. Ich rudere zurück. Gaaaanz fest.
369223920
ist representable. Aber Deine Vorstellung vom Typsystem ist totzdem schräg. Da wird nichts "konvertiert".printf()
kann gar keinefloat
s nehmen.operator<<()
für ostreams erst recht nicht wenn das gefüttertedouble
ist. Und abgeschnitten wird garnichts (bei der Übergabe an betreffende Funktion).Die besseretm Antwort:
Bei der Zeile
// float hs; // ein hoch auf two-letter-identifiers hs = a * b * 365.25 * 24 * 60;
findet implicit ein cast von
double
infloat
statt.Bei
printf("Ergebnis aus Printf: %f\n", a * b * 365.25 * 24 * 60);
bleibt es ein
double
.
-
@Swordfish sagte in Rechenprogramm liefert "machmal" falsche Werte:
Ok. Ich rudere zurück. Haaaanz fest.
369223920
ist representable. Aber Deine Vorstellung vom Typsystem ist totzdem schräg. Da wird nichts "konvertiert".printf()
kann gar keinefloat
s nehmen.operator<<()
für ostreams erst recht nicht. Und abgeschnitten wird garnichts (bei der übergabe an betreffende Funktion).Rudern wir beide zurück.
Also, wir haben den Fakt, daß ich das Ergebnis reproduzieren kann, aber nur sehr, sehr schlicht erklären. So, I'm a simple C- Guy. Halt mal den Kopf schief, ich werd dich nicht ansteigen, aber irgendwas passiert mit den 0,25 und warum und wieso vertage ich für mich auf morgen, was ja schon wieder heute ist. Alles cool?
-
Mit den 0.25 passiert garnichts aufregendes. Alles andere wird zu
double
.Alles easy bro. Aber den Grund für die Ausgabe habe ich oben genannt. Einmal ist es
float
der bei Übergabe anprintf()
in eindouble
gestopft wird und bei der direkten Berechnung als Parameter fürprintf()
eindouble
.Die Nächstmögliche Repräsentation von
369.223.920
alsfloat
(auf üblichen Architekturen, IEEE-sonstwas mit 16 bit) ist 369.223.936
-
@Swordfish ich bin seit 5:00 gestern auf, ich bin alle. Morgen nörgeln wir weiter
-
@Sarkast Siehe edit.
@Sarkast sagte in Rechenprogramm liefert "machmal" falsche Werte:
ich bin seit 5:00 gestern auf
Sportlich.
-
Das liefert aber gar keine falsche Werte.
-
@Sarkast sagte in Rechenprogramm liefert "machmal" falsche Werte:
@Swordfish ich bin seit 5:00 gestern auf, ich bin alle. Morgen nörgeln wir weiter
Dann lies aber vorher nochmal alle Antworten durch.
-
-
@Swordfish sagte in Rechenprogramm liefert "machmal" falsche Werte:
Den Unausgeschlafenen (Sarkast).
Ich habe ihn zitiert, wo er dich angesprochen hat.
-
@DirkB Aso. Sorry.
-
@DirkB Na, da hatte Swordfish wohl ein wenig @edit gespielt oder ich war zu platt, noch alles nachzuvollziehen. Ich muß so früh raus, um meinen Bus zu erwischen. Aber es sieht ganz sinnvoll aus, was da steht.
Ich werd nochma gucken, was aus dem Compilat hervorgeht, aber zuerst Mittagessen, dann Rasen stutzen, dann ggf nörgeln.
-
@Sarkast sagte in Rechenprogramm liefert "machmal" falsche Werte:
Na, da hatte Swordfish wohl ein wenig @edit gespielt oder ich war zu platt, noch alles nachzuvollziehen.
Das
wWesentliche habe ich gestern ziemlichZzeitnah editiert.// edit: pun intended.
-
Nimm für hs ein double da prinf float in double convertiert weshalb mit einem float 16 mehr Rauskommen keine Ahnung.
-
@Abe sagte in Rechenprogramm liefert "machmal" falsche Werte:
weshalb mit einem float 16 mehr Rauskommen keine Ahnung.
Weil das da. Du hättest aber einfach auch die bisherigen Beiträge lesen können.
-
@Swordfish danke hab schon gelesen das ihr das erwähnt hab. Hab halt noch nie von gehört und es in der Sekunde versucht getrost zu ignorieren.
-
Nimm mal an, ein float hätte nur 3 Bit. Dann kann ich damit 8 Werte darstellen. Beispielsweise 0/8, 1/8, 2/8, 3/8, ... oder in Dezimalschreibweise: 0, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875. Das ist effektiv weniger als eine Dezimalstelle an Genauigkeit, denn ich könnte dir 0, 0.1, 0.2, 0.3, 0.5, 0.6, 0.7, oder 0.8 sagen, und du wüsstest jeweils exakt, welche der darstellbaren Zahlen ich damit meine (und 0.4 und 0.9 fehlen sogar). Trotzdem hat die vollständige Darstellung dieser Zahlen im Dezimalsystem bis zu 3 Nachkommastellen. Diesbezüglich ist es egal, dass man nur eine zählende Stelle hat (bzw. sogar ein bisschen weniger), die Darstellung interessiert sich dafür nicht.
Dabei ist der Transfer vom Binärsystem ins Dezimalsystem noch halbwegs gutartig. Angenommen der float würde intern nicht binär sondern mit einem 3-wertigen Tri-Bit arbeiten. Dann hätte ein float mit 2 solcher Tri-Bits 9 mögliche Zustände 0/9, 1/9, 2/9, und so weiter. Das sind effektiv immer noch weniger als eine Dezimalstelle, aber wenn man die Zahlen im Dezimalsystem vollständig ausschreiben wollte, bräuchte jeder dieser Werte (außer 0) unendlich viele Stellen!
Genauigkeit != Anzahl der Stellen der Darstellung
Dass man alle Binärzahlen im Dezimalsystem exakt darstellen kann, liegt übrigens an den Primfaktoren. Die Basis des Binärsystems (2) ist vollständig in der Basis des Dezimalsystems (10=2*5) enthalten. Die Basis des Dreiersystems (3) hingegen gar nicht, daher sind alle Werte des Dreiersystems in Dezimalschreibweise so krumm (außer die, wo sich die 3 wegkürzt, also die Ganzzahlen). Und auch umgekehrt von Dezimal zu Binär fehlt die 5, daher ist 0.1 = 1/(2*5) nicht exakt im Binärsystem darstellbar (Häufiger Fallstrick beim Programmieren! Initialisiert man Fließkommawerte mit 0.1 oder ähnlichem, dann ist das gar nicht genau 0.1!), sondern nur so Werte wie 0.5 = 5/(2*5) = 1/2 oder 0.75 = 75 / (2*5)^2 = 3/2^2, wo sich die 5 heraus kürzt.