@the_isz
Das geht so nicht in C, da gibt es keine namespaces, keinn
:: usw. usf. 😉
@Iceberg
Folgendes kompiliert bei mir ohne Probleme:
#include <stdio.h>
#include <math.h>
int main() {
double zahl1;
double zahl2;
double zahl3;
printf("Geben sie eine Basis und den Exponenten an: ");
scanf("%lf %lf", &zahl1, &zahl2); //Einlesen von Basis und Exponent
zahl3 = pow(zahl1, zahl2); //Aufrufen der Funktion pow() auf mathematics.h
printf("%lf hoch %lf ist %lf\n", zahl1, zahl2, zahl3);
return 0;
}
Für diesen Mathekram brauchst du die libm, der gcc-Aufruf sieht folgendermaßen aus.
gcc -o potenzieren -Wall potenzieren.c -lm
Deinen Quellcode habe ich nur kurz überflogen, aber ein paar Schnitzer sind noch drin. Dein Fehler beruht
wahrscheinlich auf einer falschen Abfrage, die eine Schleife zu lang ausführt, die wiederum einen
Wertebereich überlaufen lässt: Den Fehler habe ich aber noch nicht gefunden.
Ich habe die
while-Schleifen angepasst, ich hoffe das passt so, die
pow-Funktion heißt jetzt
auch anders, ich hoffe ich habe das richtig verstanden.
mathematics.h sollte ungefähr so aussehen:
#ifndef __MATHEMATICS_H_
//Einfacher potenzieren für die Funktion sqrt()
//
double pow3(double ,double );
//Die Wurzel wird durch Annäherung gezogen.
//Es wird versucht, den Fehler minimal zu halten
double sqrt2(double ,double );
//Potenzieren ist an sich ja eine ganz einfache Sache - solange man es mit ganzzahligen Exponenten zu tun hat.
//Sollte der Exponent eine Dezimalzahl sein, muss man sich mit Wurzelziehen behelfen
double pow2(double ,double );
#endif //__MATHEMATICS_H_
mathematics.c sollte ungefähr so aussehen:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "mathematics.h"
//Einfacher potenzieren für die Funktion sqrt()
//
double pow3(double basis, double exponent) { //Aus dem Hauptprogramm werden Basis und Exponent übernommen
double loop = 0; //Scgleifenvariable
double erg = 1.0; //Ergebnisvariable
int exp = exponent; //Variable zum Vergleich mit der Schleifenvariable
while(loop < exp) {
erg = erg * basis;
loop++;
}
return erg;
}
//Die Wurzel wird durch Annäherung gezogen.
//Es wird versucht, den Fehler minimal zu halten
double sqrt2(double p, double a) { //Entweder aus dem Hauptprogramm oder einer anderen Funktion wird ein Wert übernommen
double x = 2.0; //Variable zum Bestimmen der Wurzel
double y; //Variable zum Bestimmen der Wurzel, Ergebnisvariable
while(x != y) {
y = a / x;
y = (x / p)*(p + 1.0 - (pow3(x,p) / a));
x = 0.5 * (x + y);
}
return y; //Das Ergebnis wird zurückgeliefert
}
//Potenzieren ist an sich ja eine ganz einfache Sache - solange man es mit ganzzahligen Exponenten zu tun hat.
//Sollte der Exponent eine Dezimalzahl sein, muss man sich mit Wurzelziehen behelfen
double pow2(double basis, double exponent) { //Aus dem Hauptprogramm werden Basis und Exponent übernommen
double loop = 0; //Scgleifenvariable
double erg = 1.0; //Ergebnisvariable
int exp = exponent; //Variable zum Vergleich mit der Schleifenvariable
double rest; //Rest der Differenz exponent - exp, der zum Wurzelziehen geschickt wird
rest = exponent - exp; //Berechnung des Rests
while(loop < exp) { //Das Ergebnis wird berechnet
//Dafür wird immer wieder die Basis mit dem bisherigen
erg = erg * basis; //Ergebnis multipliziert
loop++; //Nach jedem Schleifendurchlauf wird die Schleifenvariable erhöht
} //Der letzte Druchlauf findet statt, sobald loop == exp gilt
if(rest != 0) {
erg = erg * sqrt2(rest, basis); //Vom Rest wird die Wurzel gezogen. Das Ergebnis wird mit dem vorigen Ergebnis multipliziert
}
return erg; //Das Endergebnis wird zurückgeliefert
}
potenzieren.c sollte ungefähr so aussehen:
#include <stdio.h>
#include "mathematics.h" //Einbinden der Datei mathematics.h
int main() {
double zahl1;
double zahl2;
double zahl3;
printf("Geben sie eine Basis und den Exponenten an: ");
scanf("%lf %lf", &zahl1, &zahl2); //Einlesen von Basis und Exponent
zahl3 = pow2(zahl1, zahl2); //Aufrufen der Funktion pow() auf mathematics.h
printf("%lf hoch %lf ist %lf\n", zahl1, zahl2, zahl3);
return 0;
}
Kompiliert wird das so, Achtung, das kommt aus einer Cygwin und ist abgeschrieben, Rechtschreibfehler also bitte selbst korrigieren.
gcc -Wall -c mathmatics.o
gcc -Wall -c potenzieren.o
gcc -o potenzieren potenzieren.o mathmatics.o
Ein paar Dinge, die du dir (meiner Meinung nach) abgewöhnen solltest sehe ich da noch, es gibt schon
pow
in C, also benenn deine Funktionen anders, sonst gibt es nur Probleme.
while(loop != exp) ist ziemlich
eklig, nimm für sowas <, >, <= oder >=, sonst landest du schnell in Endlosschleifen. Außerdem
vergleichst du da teilweise auch
int mit
double, das geht zwar, aber auch gerne mal nach hinten los. 😉
Irgendwo gibt es folgende Zeilen
int exp = exponent; //Variable zum Vergleich mit der Schleifenvariable
double rest; //Rest der Differenz exponent - exp, der zum Wurzelziehen geschickt wird
rest = exponent - exp;
D.h.
rest ist immer 0, denn
exp ist gleich
exponent und die Differenz einer Zahl von sich selbst ist sehr oft 0. 😉
cu