Wurzel ziehen mit sqrt

OP #2520140
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
Gast #2520180
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.
Gast #2520194
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
Gast #2520284
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?
Gast #2520505
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.
#2521409
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.
Gast #2521423
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren