Befehl aus math.h -->modf

Gast
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
Gast
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!
Gast
"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
Gast
@ 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?
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
Gast
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...
Gast
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...
Gast
> ... 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

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.