www.mikrocontroller.net

Forum: Compiler & IDEs Befehl aus math.h -->modf


Autor: Bernd Bömer (behbeh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
benutze gerade die Procyon AVRLIB daraus das gpstest-Porgramm.
In einer Umrechnung wird "modf" benutzt. Leider verstehe ich nicht die 
englische Erklärung zu dem Befehl. Kann mir einer erklären, was die 
Function macht....
Vielen Dank

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

Bewertung
0 lesenswert
nicht lesenswert
Sie trennt den gebrochenen und den ganzzahligen Anteil einer
Gleitkommazahl.  Der gebrochene Anteil wird als Funktionsrückkehrwert
zurück gegeben, der ganzzahlige Anteil wird an der Speicherstelle
abgelegt, auf die das zweite Funktionsargument zeigt.

Autor: Bernd Bömer (behbeh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke...
verstanden...

Bernd

Autor: JayJay (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich aber nicht ^^

Bei mir funzt folgende Zeile nicht und ich weiß nicht warum:
//soll alle 5 Schritte eine Variable setzen 
if (modf(X, 5) == 0){
   //Variable setzen
}

Die Variable wird auch dann gesetzt, wenn X mod 5 1,2,3 usw. ergibt... 
kann mir jemand erklären warum?

Mfg, JayJay

Autor: Genervter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manoman...
#include <stdio.h>
#include <math.h>

int main()
{
  double x=1.23456;

  double integral;
  double fractional;

  fractional = modf(x, &integral);

  printf("Integral:   %f\n", integral);
  printf("Fractional: %f\n", fractional);

  return 0;
}


Ergibt:

  Integral:   1.000000
  Fractional: 0.234560



Unselbstständige Cut&Paste-Generation!

Autor: JayJay (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Unselbstständige Cut&Paste-Generation!"

Danke, Danke sehr liebenswürdig... aber programmier eigentlich nur in 
Java und bin in C nicht grade heimisch. Da die Syntax von C und Java 
sehr ähnlich ist (zumindest was verzweigungen und schleifen angeht) hab 
ich das auf dem Weg probiert...

Dein Code erklärt mir leider nicht viel!

wie wird denn "integral" initialisiert? Und warum steht ein "&" vor 
integral in der modf() funktion?

Ich wär dir sehr verbunden, wenn du mir sagen könntest, wo der fehler in 
meinem Code liegt...

Vielleicht hab ich ja auch irgendwas grundlegendes der modf() funktion 
nicht verstanden...

Normalerweise sollte modf(x,y) doch den Rest der Division von x/y geben, 
z.b. bei 43 mod 5 = 3.

Mfg, JayJay

Autor: Ahem (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ JayJay

"modf" ist eben NICHT das selbe wie "mod".

Da Jörg das schon erklärt hat dürfte doch der Unterschied klar sein. 
Oder siehst Du da eine Beziehung zwischen der Modulo-Division und dem 
extrahieren des gebrochenen Anteils einer Float-Zahl?

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie Jörg bereits gesagt hat, modf trennt eine Zahl in die Zahl vor dem 
Komma und die nmach dem Komma. Das heißst dass z.b. 1.23456 in 1 und 
0.23456 aufgespalten wird. Der erste Parameter ist die Zahl selbst, 
welche getrennt werden soll. Da eine Funktion nur einen Wert zurückgeben 
kann (von Structs und Klassen abgesehen), wird der Funktion mit dem 
zweiten Parameter die Adresse der Zahl mitgeteilt, in die die Funktion 
den einen Wert, hier den ganzzahligen Wert, reinschreibt. Der Operator & 
referenziert die darauffolgende Variable, sprich er bildet ihre Adresse, 
die die Funktion benötigt. Den Komma-Teil gibt die Funktion direkt 
zurück.

MfG Mark

Autor: JayJay (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gut, dann lichtet sich der Nebel für mich ^^

Aber seh ich das dann richtig, dass es in AVR GCC kein 
mod-befehl/funktion gibt? Zumindest konnte ich in math.h nur modf() 
finden und kein mod()...

Wär ja ein bissl seltsam, dass es diesen so häufig gebrauchten Befehl 
nicht gibt! 0.o

Denn falls mod tatsächlich nicht zur Verfügung gestellt wird muss man ja 
wahrscheinlich diesen unschönen Umweg gehen:
double nachkomma;
double zwischenergebnis;

zwischenergebnis = X / 5;
nachkomma = modf(zwischenergebnis, andere_unnütze_variable);

if (nachkomma == 0){
    //Variable setzen
}

Ich find das irgendwie ziemlich umständlich zumal ich dann mit 
Fließkommazahlen arbeiten muss, obwohl ich immer nur ganzzahlige Werte 
teilen werde...


so long...

Autor: Ahem (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ JayJay

Der "Befehl" ist in C ein Operator und schreibt sich "%". Ein gutes C 
Buch oder Tutorial sollte ihn beschreiben.

Autor: JayJay (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ahhh... kay!

Manchmal wundert man sich schon über die eigene Doofheit... warum hab 
ich zur Hölle einfach nicht daran gedacht in den Operatoren 
nachzuschaun... kopfschüttel


Ich danke euch für eure Antworten... immerhin kann ich jetzt modf() 
einsetzten, falls ich es brauche ^^

so long...

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ... aber programmier eigentlich nur in Java und bin in C nicht grade
> heimisch.

> ... obwohl ich immer nur ganzzahlige Werte teilen werde...

Wieso hast du dann nicht als erstes den %-Operator ausprobiert? An der
Stelle verhält sich C genauso wie Java. Aber jetzt weißt du's ja.

Die FP-Variante von a%b heißt übrigens fmod(a,b). modf ist etwas
anderes, wie ja schon einige geschrieben haben.

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.