Potenzwerte berechnen
-
Habe im folegnden Programm das Problem, dass mir das Ergebnis der Potenzwerte nicht richtig angezeigt wird...das Ergebnis ist immer falsch und ich weiß nicht woran es liegt....
/* Programm das Potenzwerte berechnet */ #include <stdio.h> double pow(); //Deklaration der Funktion pow int main() { double x; double result; int y; //initialize x,y typ double or int , initialize result // ask for x, x constitutes a konstant printf("Bitte geben Sie die Konstante ein : "); scanf ("%d", &x); printf("Die eingegebene Zahl war : %d\n", x); fflush(stdin);//delete input buffer // ask for y, y constitutes the potency printf("Bitte geben Sie die Potenz ein : "); scanf ("%d", &y); printf("Die eingegebene Zahl war : %d\n", y); fflush(stdin); //delete input buffer result = pow(x, y); // the funktion pow() with the arguments x,y is accessed, return x^y to variable result printf("Das Ergebnis lautet : %.2f\n" ,result); ...
-
Wenn das Ergebnis falsch ist, wäre es dann nicht sinnvoll, die Funktion zu zeigen?
-
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
%d oder %i int
%c einzelnes Zeichen
%e oder %E double im Format [-]d.ddd e±dd bzw. [-]d.ddd E±dd
%lf double im Format [-]ddd.ddd
%f float im Format [-]ddd.ddd
%o int als Oktalzahl ausgeben
%p die Adresse eines Pointers
%s Zeichenkette ausgeben
%u unsigned int
%x oder %X int als Hexadezimalzahl ausgeben
%% Prozentzeichenhttp://de.wikibooks.org/wiki/C-Programmierung:_Einfache_Ein-_und_Ausgabe#Formatelemente_von_printf
So geht das zwar auch, allerdings wirst du alle eingegebenen Gleitkommazahlen durch das %d in Ganzzahlen umwandeln und nicht die volle Speicherkapazität deines Doubles ausnutzen.
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.
Für mehr Lösung müsste ich allerdings auch die pow()-Funktion kennen.
-
Die Pow Funktion ist eine Funktion mit der man Potenzieren kann
y = pow(x, 3.0);
Würde hier ergeben y = x^3.0 nur soll das bei mir allgemein geschrieben werden...
das funktioniert aber nicht. Ichw eiß nicht wrum Also x und y haben die Werte die ich vorher mit scanf() eingebe nur das Ergebnis ist entweder Null oder komplett falsch
-
Hi,
In deinem Code aus erstem Beitrag in Zeile 5 hast du eine Funktionsdeklaration:
double pow(); //Deklaration der Funktion pow
Wo ist die dazugehörige Funktionsdefinition?
Edit:
Hast du deine Umwandlungszeichen in scanf und printf angepasst?Nochmal Edit:
Ich bin ja iwie gewillt, dir bei dem sicher relativ einfachen Problem zu helfen. Allerdings solltest du dich bemühen deine Kommentare inhaltlich richtig zu schreiben.y=pow(x, 3.0)
Ist sicherlich nicht dein gewünschter Funktionsaufruf.
-
Bei mir soll herauskommen
result = pow (x, y);
Wobei x und y dabei vom User eingegeben werden...
-
Ok, also:
eine Funktionsdeklaration, wie du sie da hast zieht eigentlich auch immernoch eine Funktionsdefinition nach sich. Deine Funktionsdeklaration solltest du also entfernen...Da du scheinbar auf die Powerfunktionen zugreifen willst. Das hier sagt meine Man-Page:
#include <math.h>
double pow(double x, double y);
float powf(float x, float y);
long double powl(long double x, long double y);Link with -lm.
Scheinbar interessiert dich die erste Funktion pow() . Da deine y-Variable vom Typ int, könntest du auch gleich ein double einlesen.
Wenn du nun also:
1. die scheinbar überflüssige Deklaration entfernst
2. #include <math.h> mit zu deinem anderen include hinzufügstSollte das ganze von der Funktion her funktionieren.
Was mich gerade stutzig macht, dass dein Compiler nicht meckert, obwohl du eine nicht fertig implementierte pow() Funktion hast.
-
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 96http://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 doublehttp://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.
-
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 96http://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 doublehttp://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.