mikrocontroller.net

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


Autor: Max Mustermann (mrmustermann)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Fritz123 (Gast)
Datum:
Angehängte Dateien:

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

Autor: André Kronfeldt (freakazoid)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: André Kronfeldt (freakazoid)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Egon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was bekommst Du bei fmod(47.001,10) heraus ?

Autor: André Kronfeldt (freakazoid)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: André Kronfeldt (freakazoid)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Egon: fmod(47.001,10)=7.001000

Autor: Fritz123 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: André Kronfeldt (freakazoid)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Max Mustermann (mrmustermann)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Egon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.