Forum: Compiler & IDEs fmod() liefert falsches Ergebnis...


von Max M. (mrmustermann)


Lesenswert?

Hallo,
ich bekomme mit fmod(47,10) 6 als Ergebnis, obwohl 7 richtig wäre.
Fmod(32,10) liefert korrekt 2 zurück. Was mache ich da falsch?
Gruß
Mustermann

von Fritz123 (Gast)


Angehängte Dateien:

Lesenswert?

Die Lösung  ist im beiliegeneden LabVIEW-Programm (als jpg-Datei).
Vielleicht findet jemand an dieser Programmiersprache gefallen.
Gruss
Fritz123

von André K. (freakazoid)


Lesenswert?

Wieso Lösung? Du hast auch 2 und 7 raus. Der OP bemängelt aber, daß bei
ihm '6' rauskommt.
confused

Grüße, Freakazoid

von André K. (freakazoid)


Lesenswert?

Ach noch was. Laut der manpage ...

> Die Funktion fmod() berechnet den Rest der Division von x durch y.
> Dies ist der Wert x - n * y, wobei n der auf die nächst größere
ganze
> Zahl gerundete Wert von x durch y ist.

Paßt 'floor' nicht zu 'nächst größere ganze Zahl'. wobei das in der
Manpage wohl eher falsch ist.

Grüße, Freakazoid

von Egon (Gast)


Lesenswert?

Was bekommst Du bei fmod(47.001,10) heraus ?

von André K. (freakazoid)


Lesenswert?

So. Es kommt nur 7 raus und das ist gut so. Du interpretierst bestimmt
das Ergebnis falsch. gibst du es denn direkt aus?

<C>
#include <stdio.h>
#include <math.h>

int main(void)
{
    double x,y;
    x=47;
    y=10;
    double res = fmod(x,y);
    printf("%f", res);
    exit(0);
}
</C>

ergibt jedenfalls: 7.000000

Grüße, Freakazoid

von André K. (freakazoid)


Lesenswert?

@Egon: fmod(47.001,10)=7.001000

von Fritz123 (Gast)


Lesenswert?

Hallo
(47hex,10hex)=7hex , ich habe leider nicht so genau gelesen, dass
das Ergebnis vom Max mit dem Wert 6 bemängelt wurde.
Mein Beitrag ist offensichtlich doch nicht die Lösung
Fritz123

von André K. (freakazoid)


Lesenswert?

Ich denke man kann jedes Zahlensystem nehmen mit Basis>7 ;-)
z.B. Oktal
fmod(47oct,10oct) => fmod(39,8) => 4 Rest 7
Basis 9: fmod(47,10) => fmod(43,9) => 4 Rest 7
...

Vermutlich wird das Ergebnis nicht direkt ausgegeben, sondern so
weiterverarbeitet daß er auf einen falschen Wert schließt.

Grüße, Freakazoid

von Rolf Magnus (Gast)


Lesenswert?

Meine Glaskugel behauptet, daß Max das Ergebnis fälschlicherweise
einfach nach int konvertiert und das dann ausgibt. Kleine
Rundungsfehler in der Fließkommaberechnung sorgen dafür, daß sowas wie
6,9999999 rauskommt. Die Konvertierung hackt dann die Nachkommastellen
ab, und es kommt 6 raus.
Allerdings ist meine Glaskugel seit der letzten Reparatur nicht mehr
das, was sie mal war. Hätte Max Quellcode gepostet, bräuchte ich sie
auch gar nicht.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Er schreibt ja nichtmal, für welche Umgebung (Prozessor, Bibliothek,
GCC-Version) das überhaupt passiert, und bei seiner Geburt haben
sie offenbar aus Versehen das Muster der Geburtsurkunde beim
Standesamt eingereicht statt des richtigen Exemplars...

von Max M. (mrmustermann)


Lesenswert?

Hehe nun mal langsam...
Habe den Tip bekommen, zu der zu fmod'enden Zahl 0.5 hinzuzuaddieren,
weil sonst abgerundet wird.
Auf jedenfall geht es damit.

von Egon (Gast)


Lesenswert?

Mit meinem Tip hättest Du nur 0.001 addieren müssen; ist also viel
sparsamer :-)

Letzlich ist nicht die fmod()-Funktion fehlerbehaftet, sondern die
Wandlung von float->int, wie immer Du sie ausgeführt hast.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.