Potenzwerte berechnen



  • Hab mein Problem gelöst :

    /* Programm das Potenzwerte berechnet */
    
    #include <stdio.h>
    #include <math.h>
    
    double pow();   //declare  function pow that can potentialize constants
    
    int main()
    {
        double x, y;    
       //initialize  x,y both typ double
    
                  // ask for x, x constitutes a konstant             
                   printf("Bitte geben Sie die Konstante ein : ");
                   scanf ("%lf", &x);
                  // ask for y, y constitutes a potency
                   printf("Bitte eine Potenz eingeben : ");
                   scanf ("%lf", &y); 
                   fflush(stdin);
                  //delete input buffer
                   printf("Potenz von x hoch y : %.2lf\n", pow(x, y));
    
        return 0;
    }
    
    // So abgeädert, dass alle Potenzen ausgerechnet werden können
    

    Danke an Euch 🙂



  • Du gibst bei deine Funktionsdeklaration keien Parameter an.
    Daher kann der Compiler nicht wissen, dass die Funktion pow() zwei double-Parameter erwartet.

    Entweder richtig deklarieren oder durch ein cast richtig übergeben oder den entsprechende Header (math.h) einbinden.



  • Wenn du math.h einbindest solltest du deine Deklaration weglassen. Die steht schon in math.h



  • Ja, also meines Wissens sind in C weder überladene Funktionen noch überschriebene Funktionen wirklich sinnvoll... wenn das also ohne Compilergemeckere gehen sollte, dann hast du schlichtweg Glück gehabt.

    Hier noch ein drittes Mal:
    Entferne deine Deklaration.

    Deklarationen werden eigentlich nur in zusammenhang mit entsprechenden Funktionsdefinitionen genutzt. Die Nutzung sowohl von Deklaration als auch Definition impliziert, dass du dir deine eigenen Funktionen einfügst 😉



  • DaRe schrieb:

    Hallo Zwiebels,

    solltest du, wenn du schon einen double für die Basis benutzt, nicht auch mit einem %lf scanf durchführen:
    scanf("%lf", &x);

    Zeichen Umwandlung
    ...

    Was soll denn der Unsinn?
    Oben scanf nennen und danach dann die Formatspezifizierer für printf aufführen?
    Falls du es nicht weißt, die sind nicht gleich.



  • Und ich dachte für Potenz reicht ein simpler boolscher Wert.



  • DaRe schrieb:

    Das gleiche gilt übrigens auch für printf() 😉 mit deinen %f liest du nur die Hälfte, also 4 Byte, der 8 Byte langen double Variablen result aus.

    Schon wieder falsch.
    Wo steht, dass float 4 und double 8 Byte lang sind?
    Ein float kommt nie bei printf an, wird zuvor als Argument immer in double gewandelt, deshalb ist auch %f für float und double spezifiziert und nicht etwa %lf.



  • Wutz schrieb:

    DaRe schrieb:

    Hallo Zwiebels,

    solltest du, wenn du schon einen double für die Basis benutzt, nicht auch mit einem %lf scanf durchführen:
    scanf("%lf", &x);

    Zeichen Umwandlung
    ...

    Was soll denn der Unsinn?
    Oben scanf nennen und danach dann die Formatspezifizierer für printf aufführen?
    Falls du es nicht weißt, die sind nicht gleich.

    Ok, das ist mein Fehler.

    Wutz schrieb:

    DaRe schrieb:

    Das gleiche gilt übrigens auch für printf() 😉 mit deinen %f liest du nur die Hälfte, also 4 Byte, der 8 Byte langen double Variablen result aus.

    Schon wieder falsch.
    Wo steht, dass float 4 und double 8 Byte lang sind?
    Ein float kommt nie bei printf an, wird zuvor als Argument immer in double gewandelt, deshalb ist auch %f für float und double spezifiziert und nicht etwa %lf.

    Hier hast du eine Information über die Größe von float und double:

    Type Bytes Bits Range

    short int 2 16 -32,768 -> +32,767 (16kb)
    unsigned short int 2 16 0 -> +65,535 (32Kb)
    unsigned int 4 16 0 -> +4,294,967,295 ( 4Gb)
    int 4 32 -2,147,483,648 -> +2,147,483,647 ( 2Gb)
    long int 4 32 -2,147,483,648 -> +2,147,483,647 ( 2Gb)
    signed char 1 8 -128 -> +127
    unsigned char 1 8 0 -> +255
    float 4 32
    double 8 64
    long double 12 96

    http://www.lix.polytechnique.fr/~liberti/public/computing/prog/c/C/CONCEPT/data_types.html

    Wenn die Werte nicht dem heutigen Standard entsprechen findest du einige Zeilen weiter oben:

    ANSI has the following rules:

    short int <= int <= long int
    float <= double <= long double

    http://www.lix.polytechnique.fr/~liberti/public/computing/prog/c/C/CONCEPT/data_types.html
    Wenn du mir nun also weis machen willst, dass ein float nie weniger Speicher als ein double hätte, dann bezweifle ich das doch sehr. Wenngleich die 4 bzw. 8 Bytes aus diesem Artikel stammen.

    Die Modifier hab ich mir eben nochmal angeschaut. Dass zwischen float und double bei printf eignetlich gar nicht unterschieden wird, ist mir neu gewesen.


  • Mod

    DaRe schrieb:

    Hier hast du eine Information über die Größe von float und double:

    Type Bytes Bits Range

    short int 2 16 -32,768 -> +32,767 (16kb)
    unsigned short int 2 16 0 -> +65,535 (32Kb)
    unsigned int 4 16 0 -> +4,294,967,295 ( 4Gb)
    int 4 32 -2,147,483,648 -> +2,147,483,647 ( 2Gb)
    long int 4 32 -2,147,483,648 -> +2,147,483,647 ( 2Gb)
    signed char 1 8 -128 -> +127
    unsigned char 1 8 0 -> +255
    float 4 32
    double 8 64
    long double 12 96

    http://www.lix.polytechnique.fr/~liberti/public/computing/prog/c/C/CONCEPT/data_types.html

    Wenn die Werte nicht dem heutigen Standard entsprechen findest du einige Zeilen weiter oben:

    ANSI has the following rules:

    short int <= int <= long int
    float <= double <= long double

    http://www.lix.polytechnique.fr/~liberti/public/computing/prog/c/C/CONCEPT/data_types.html
    Wenn du mir nun also weis machen willst, dass ein float nie weniger Speicher als ein double hätte, dann bezweifle ich das doch sehr. Wenngleich die 4 bzw. 8 Bytes aus diesem Artikel stammen.

    Die Modifier hab ich mir eben nochmal angeschaut. Dass zwischen float und double bei printf eignetlich gar nicht unterschieden wird, ist mir neu gewesen.

    Selfowned?



  • DaRe schrieb:

    Wutz schrieb:

    Wo steht, dass float 4 und double 8 Byte lang sind?
    Ein float kommt nie bei printf an, wird zuvor als Argument immer in double gewandelt, deshalb ist auch %f für float und double spezifiziert und nicht etwa %lf.

    Hier hast du eine Information über die Größe von float und double:
    ...

    Da hast du aber brav was abgeschrieben.
    ANSI C definiert für die 3 Fließkommatypen keine Größen, sondern (Mindest)Bereiche, definiert in float.h; in wieviele Bytes der Compilerbauer das abbildet ist seine Sache und unspezifiziert.
    Da hilft dir dein zusammengegoogeltes Zeugs nichts.
    Für integrale Typen werden übrigens auch nur Mindestbereiche aber hier auch Mindestgrößen spezifiziert.

    DaRe schrieb:

    Die Modifier hab ich mir eben nochmal angeschaut. Dass zwischen float und double bei printf eignetlich gar nicht unterschieden wird, ist mir neu gewesen.

    Zeigt auch wieder, dass du den Standard nur vom Hörensagen kennst und somit auch die dort sehr wohl spezifizierten Standardargumentumwandlungen.


Anmelden zum Antworten