M. B. schrieb:> Mit der printf funktion> kontrolliere ich das Ergebnis:> printf("%d",z);
Nö, du kontrollierst z !
> z wird aber immer mit dem wert 9 angezeigt!
so ist es auch richtig.
> Was ist da noch falsch?
du solltest:
printf("%f", sqrt(z));
schreiben
Klaus
Die Variable z hat den Inhalt 9.
Man übergibst der Funktion aber nicht wirklich die Variable z, sondern
nur eine Kopie mit deren Wert von 9. Das nennt sich "call by value" und
ist, ich nenne es einfach mal eine "Spezialität" von C. Daher wird die
Funktion auch an der originalen Variable z selbst nichts ändern. Wie
oben geschrieben, Du musst den Rückgabewert auswerten.
z.B.: double y = sqrt(z);
Jetzt hätte die Variable y (vom Typ double) den Wert 3. Oder eben wie
oben mit printf anzeigen lassen.
> int z = 9;> double sqrt(double z);> printf("%d",z);> Was ist da noch falsch?
Autsch. Dein erster Programmierversuch ?
#include <math.h>
printf("%lf",sqrt(9))
wäre richtiger, schliesslich ist sqrt eine Funktion
wie Sinus sin und liefert einen double (long float %lf),
aber jeder anständige uC hat dann den Speicher voll,
denn printf zum ausdrucken von floating point Zahlen
ist dutzende Kilobytes gross (und muss manchmal erst
explizit eingeschaltet werden).
Wenn man aus einer ganzen Zahl die Quadratwurzel ziehen will,
nimmt man besser eine ganzzahl-Quadratwurzel-Funktion.
int isqrt(int n)
{
register unsigned int m, root = 0, left = n;
for ( m=1; m < n>>2; m <<= 2) ;
for ( ; m; m >>= 2 )
{
if ( ( left & -m ) > root )
left -= ( root += m ), root += m;
root >>= 1;
}
return root;
}
int z=9;
z=isqrt(z);
printf("%d",z);
liefert dann 3
nicht der Karl-Heinz schrieb:> Das nennt sich "call by value" und> ist, ich nenne es einfach mal eine "Spezialität" von C. Daher wird die> Funktion auch an der originalen Variable z selbst nichts ändern
Das ist nun wirklich keine Eigenheit von C.
MaWin schrieb:> aber jeder anständige uC hat dann den Speicher voll,> denn printf zum ausdrucken von floating point Zahlen> ist dutzende Kilobytes gross (und muss manchmal erst> explizit eingeschaltet werden).>> Wenn man aus einer ganzen Zahl die Quadratwurzel ziehen will,> nimmt man besser eine ganzzahl-Quadratwurzel-Funktion.
Ob es sich auf dem PC (Forum beachten) wohl lohnt, das bisschen Speicher
zu sparen?
besagt, dass die Funktion sqrt einen double-Wert als Parameter erwartet
und einen double-Wert zurückgibt.
Du kanst diesen Rückgabewert
- einer Variablen zuweisen
- in einer Berechnung verarbeiten
- einer anderen Funktion als Parameter übergeben.
Also eigentlich überall dort, wo man auch eine Zahl einsetzen kann.
1
doublex;
2
x=sqrt(9);
Eine Integervariable/zahl wird automatisch zur double erweitert.
MaWin schrieb:> #include <math.h>> printf("%lf",sqrt(9))>> wäre richtiger, schliesslich ist sqrt eine Funktion> wie Sinus sin und liefert einen double (long float %lf),
Nein. Der Format-Specifier für double ist %f. Seit C99 ist %lf immerhin
erlaubt, aber das l wird ignoriert.
Rolf Magnus schrieb:> Nein. Der Format-Specifier für double ist %f. Seit C99 ist %lf immerhin> erlaubt, aber das l wird ignoriert.
:-)
Die normative Kraft des Faktischen.
Das zeigt dann wohl, daß Millionen von Programmierern variable
Argumentlisten nicht verstehen. Sonst wüßten sie, daß printf gar nicht
die Möglichkeit hat, zwischen float und double zu unterscheiden.
Rolf Magnus schrieb:> Das zeigt dann wohl, daß Millionen von Programmierern variable> Argumentlisten nicht verstehen. Sonst wüßten sie, daß printf gar nicht> die Möglichkeit hat, zwischen float und double zu unterscheiden.
Es war einfach nur Bequemlichkeit.
printf hat meistens %lf genauso unterstützt, weil es für viele
Programmierer unpraktisch war bei scanf zwar zwischen %lf und %f
unterscheiden zu müssen, bei printf aber auf lediglich %f festgenagelt
zu sein. Sowas verhinderte zb das Ablegen eines (1) Formatstrings zur
gleichzeitigen Verwendung von scanf und printf. Das rausfiltern des l
hingegen ist im printf eine leichte Übung.
Es hatten alle printf Implementierungen, mit denen ich bisher seit 1988
zu tun hatte, immer auch ein %lf.
Daher auch: Die normative Kraft des Faktischen.
Faktisch haben das C-Systeme schon seit langer, langer Zeit unterstützt,
jetzt ist es vorgeschrieben.
Es gibt keine Nachteile von %lf. Das einzige, was man sich einhandelt,
wenn man das l von %lf weglässt, ist, daß das Programm auf einen
Compiler, der eines Tages doch mal float anders auf den stack legt als
double, nicht portabel wäre.
Nein, ich kenne auch keinen, aber so eine Erweiterung der C-Sprache wäre
gerade bei uC mit begrenztem Speicher nicht so unklug.
M. B. schrieb:> ich arbeite mit dem Dev-C++, programmiere in c und möchte die> Quadratwurzel aus 9 bekommen.
Das ist doch mit Kanonen auf Spatzen geschossen. Die Quadratwurzel aus 9
solltest du gerade noch mit Kopfrechnen herausbekommen.