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


von Bernd B. (behbeh)


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

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


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.

von Bernd B. (behbeh)


Lesenswert?

Danke...
verstanden...

Bernd

von JayJay (Gast)


Lesenswert?

Ich aber nicht ^^

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

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

Mfg, JayJay

von Genervter (Gast)


Lesenswert?

Manoman...
1
#include <stdio.h>
2
#include <math.h>
3
4
int main()
5
{
6
  double x=1.23456;
7
8
  double integral;
9
  double fractional;
10
11
  fractional = modf(x, &integral);
12
13
  printf("Integral:   %f\n", integral);
14
  printf("Fractional: %f\n", fractional);
15
16
  return 0;
17
}


Ergibt:

  Integral:   1.000000
  Fractional: 0.234560



Unselbstständige Cut&Paste-Generation!

von JayJay (Gast)


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

von Ahem (Gast)


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?

von Mark .. (mork)


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

von JayJay (Gast)


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:
1
double nachkomma;
2
double zwischenergebnis;
3
4
zwischenergebnis = X / 5;
5
nachkomma = modf(zwischenergebnis, andere_unnütze_variable);
6
7
if (nachkomma == 0){
8
    //Variable setzen
9
}

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...

von Ahem (Gast)


Lesenswert?

@ JayJay

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

von JayJay (Gast)


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...

von yalu (Gast)


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.

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.