für alle die sich schon einige stunden mit ihrem programm plagen und sich fragen wieso das double euerer myexp fkt immer den wert 0 herauswirft, gibts jetzt abhilfe.
der dank geht natürlich an unsere tollen proffesoren die uns nicht gesagt haben das man ein double nicht mit %d aufruft sondern mit %lf (für longfloat). es is freitag der tag war sonnig und dank dieser meisterleistung hab ich so viel zeit ver********* das ich wiedermal net raus konnte DANKE …
also nicht vergessen bei ausgabe der werte sprich printf("%lf anstatt das vermutete %d, und alles sollt passen falls es noch probs gibt ich könnte die programme online stellen aber sie sind nicht wirklich schwer
schönes we
ciao
Was, das wurde euch tatsächlich nicht gesagt?
Hm, sowas ist natürlich ärgerlich …
Wurde euch beigebracht, wie man die Manpages aufruft?
Wenn man nämlich in der Shell (Konsole, Bash, …) „man 3 printf“ aufruft ist genau erklärt, was man bei printf wie verwendet.
Ich empfehle übrigens, den Compiler mit den Parametern -Wall und -pedantic aufzurufen, also so: „gcc -pedantic -Wall -o Ausgabedatei Quelltext“.
Dann liefert der Compiler eine Warnung, wenn man %d bei Double-Variablen verwendet.
ja es ist war das ich hätte im manual nachschauen können
aber wie gesagt als anfänger habe ich den fehler in meiner Funktion gesucht und nicht im printf und da verging halt viel zeit weil ich alles versucht habe…
nächstes mal werde ich mir das sicher vorknöpfen
aber danke für den typ mit dem -wall
-pendantic kenne ich net
Ich schließe mich gleich ärgernd an… Was für einen Sinn macht long wenn das genausoviele byte hat wie int?
Es gibt long int und short int.
Int ist auf manchen Rechnern long int, auf anderen aber short int. Das ist betriebssystemabhängig.
Aber meistens brauchst den Unterschied eh nicht, einfach int verwenden und fertig.
Ah, das macht Sinn, danke… Trotzdem mag ich Sprachen lieber die sich um diese haarigen(haarspalterischen) Details kümmern - auf jeden Fall für so Kleinprogramme (-;
Wo hast Du denn das gebraucht? Für den Sieb des Erathostenes?
Da hab ich einfach int genommen und mir war egal, wieviel byte int hat.
man sizeof
Nein, nicht das Sieb. Die Exponentialfunktion, bzw. die Fakultaet( zum selberschreiben)
Naja, ich wollte die Genauigkeit erhöhen, und dachte das ist DIE Anwendung für long. Bis mich sizeof eines besseren belehrte. Jetzt verwende ich double.
Genauigkeit erhöhen? Mit einem Integer-Typ?
Du meinst wohl eher, daß Du größere Zahlen haben wolltest.
Meinst Du sowas?
double fak(int j)
{
int i;
double result = 1.0;
for(i = 1; i <= j; i++) result *= (double) i;
return result;
}
Exakte Werte bekommst Du bei großen Zahlen allerdings nicht mehr.
Ich wollte größere Zahlen weil dass die Genauigkeit bei der exp Funktion erhöht… (Wir sollten sie als Reihenentwicklung implementieren)
Das hilft aber nur bei double vs float und nicht bei größeren Ganzzahlen.
Int wird nie ungenau, da kann Dir höchstens passieren, daß die Variable überläuft.
Dann halt so:
double exp(double base, int ex)
{
int i;
double result = 1;
for(i = 0; i < ex; i++) result *= base;
return result;
}
Ich meinte exp() wie e^x nicht pow(). Und die Reihenentwicklung dazu lautet:
1+\frac{z}{1!}+\frac{z^2}{2!}+\cdots
Und wenn meine Fakultaet höhere Zahlen exakt(also ohne Überlauf) verarbeiten kann, dann kann ich die Reihe später abbrechen, und bekomme genauere Zahlen…
Ciao, G
Achso, alles klar! Für sowas ist int eh ungeeignet, da man vor der Division sowieso auf float oder double konvertieren muß. Paß halt bei der Konvertierung auf.
Ihr zarrts aber ordentlich an …
jo ka wieso wir den anderen so davon düsen aber wenigstens haben wir mehr davon:D
leute, hats schon irgendwer für dienstag das prog? plag mich gerade herum, habs an und für sich geschrieben, nur einige probleme. irgendwie akzeptiert er das struct nicht, das an die Read-Funktion übergeben wird und zum anderen liest er die werte ohne jegliche fehlermeldung einfach nicht aus…
könnte bitte wer einen funktionierenden source posten, damit ich meine fehler ausbessern kann. wär ganz nett.
Ok bevor ich das hier poste soll halt jedem klar sein der sich das reinzieht das es nur zur hilf gedacht ist und nicht zum kopieren da es da schon einige probleme gegeben hat und ich sicher nicht draufzahlen will nur weil ich hilfsbereit bin:)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct point {int row,col;};
struct MMinMax{ struct point cr_min;
double vmin;
struct point cr_max;
double vmax;
};
double **Read(char *FileName,struct point *len_cr)
{
int i,j,r,c;
double **pointer;
FILE *infile;
infile=fopen(FileName,"r");
if(infile==NULL)
{
printf("Fehler");
perror("reason");
exit(1);
}
fscanf(infile,"%i,%i",&r,&c);
(*len_cr).row=r; /* len_cr->row=r;*/
len_cr->col=c; /* (*len_cr).col=c; */
pointer=(double**)malloc(r*sizeof(double*));
for(i=0;i<r;i++)
{
pointer[i]=(double*)malloc(c*sizeof(double));
}
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
{
fscanf(infile,"%lf",&(pointer[i][j]));
}
}
return pointer;
}
void Print(double ** pM, struct point len_cr)
{
int i,j;
double k=0,l=0;
k=len_cr.row;
l=len_cr.col;
for(i=0;i<k;i++)
{printf("\n\n");
for(j=0;j<l;j++)
{
printf("%13.lf",pM[i][j]);
}
}
printf("\n\n");
}
void SearchMinMax(double **pM, struct point len_cr, struct MMinMax *mm)
{
int i,j;
double k=0,l=0;
mm->vmax=pM[0][0];
mm->vmin=pM[0][0];
mm->cr_min.row=1;
mm->cr_min.col=1;
mm->cr_max.row=1;
mm->cr_max.col=1;
k=len_cr.row;
l=len_cr.col;
for(i=0;i<k;i++)
{
for(j=0;j<l;j++)
{
if(mm->vmax<pM[i][j])
{
mm->vmax=pM[i][j];
mm->cr_min.row=i+1;
mm->cr_min.col=j+1;
}
}
}
for(i=0;i<k;i++)
{
for(j=0;j<l;j++)
{
if(mm->vmin>pM[i][j])
{
mm->vmin=pM[i][j];
mm->cr_max.row=i+1;
mm->cr_max.col=j+1;
}
}
}
}
int main(int argc, char **argv)
{/* Groesse der Matrix */
struct point length;
/* Min und Max */
struct MMinMax mami;
/* Zeiger fuer Matrix */
double **m;
int z;
/* Pruefen der Anzahl derKommandozeilenparameter */
if (argc != 2)
{printf("Usage: %s filename\n",argv[0]);
exit(1);
}
/* Einlesen der Matrix
Filename ist 1. Kommandozeilenparameter
Speicher wird in Read reseviert */
m=Read(argv[1],&length);
/* Pruefen ob gueltiger Zeiger */
if (m==NULL)
{printf("Error reading %s",argv[1]);
exit(1);
}
/* Ausgeben der Groesse (durch Parameter length uebergeben)
der Matrix */
printf("%d lines, %d columns\n",length.row,length.col);
/* Ausgeben der Matrix */
Print(m,length);
/* Suche von Min und Max
Uebergabe des Ergebnisses durch struct MMinMAx mami */
SearchMinMax(m,length,&mami);
/* Ausgeben der Werte */
printf("Min: %f (%d,%d), Max: %f (%d,%d)\n",
mami.vmin,mami.cr_max.row,mami.cr_max.col,
mami.vmax,mami.cr_min.row,mami.cr_min.col );
/* Freigabe des zuvor in Read(..) reservierten Speichers */
for (z=0;z<length.row;z++)
free(m[z]);
free(m);
exit(0);
Die geöffnete Datei sollte auch irgendwo wieder geschlossen werden.
Außerdem würde ich Quelltext zwischen und
posten, damit die Einrückung erhalten bleibt.
Habs mal auf code geändert…
Ok, wenn keine Einrückung drin is kann natürlich auch keine angezeigt werden.
Wurde euch das noch nicht beigebracht, dass Gliederung und Dokumentation wichtig sind?!