Forum: PC-Programmierung Wurzel ziehen mit sqrt


von Ma B. (drumstick)


Lesenswert?

Hello!

ich arbeite mit dem Dev-C++, programmiere in c und möchte die 
Quadratwurzel aus 9 bekommen.

Im Buch steht das so:
1
double sqrt(double zahl);

Ich habe
1
int z = 9;
 und z anstelle von zahl geschrieben. Mit der printf funktion 
kontrolliere ich das Ergebnis:
1
 printf("%d",z);

z wird aber immer mit dem wert 9 angezeigt!

Was ist da noch falsch?

Gruss M

von docean (Gast)


Lesenswert?

ganzen Code zeigen....

printf("%d",sqrt(z));
printf("%d",sqrt(9));

probier das mal, wenn es geht lies mal was über Rückgabewerte von 
Funktionen...

von Klaus (Gast)


Lesenswert?

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

von Klaus (Gast)


Lesenswert?

ach ja, dieses sqrt() will double und liefert double zurück.
Kein int !

Klaus

von Udo S. (urschmitt)


Lesenswert?

M. B. schrieb:
> Was ist da noch falsch?

Das du kein C Buch hast.

von nicht der Karl-Heinz (Gast)


Lesenswert?

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.

von MaWin (Gast)


Lesenswert?

> 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

von gaast (Gast)


Lesenswert?

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?

von DirkB (Gast)


Lesenswert?

Das
1
double sqrt(double zahl)
 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
double x;
2
x = sqrt(9);

Eine Integervariable/zahl wird automatisch zur double erweitert.

von Rolf M. (rmagnus)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von DirkB (Gast)


Lesenswert?

Millionen von Programmierern können nicht irren :-)

von Rolf M. (rmagnus)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von MaWin (Gast)


Lesenswert?

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.

von my2cent (Gast)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.