Wurzel ziehen mit sqrt

OP #2520140
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
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
Gast
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
> 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
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
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.
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
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.
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.