Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » ungenaue Ausgabe der Kreisfläche

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
08.03.2007, 01:50 Uhr
kasimirle



Hallo, es geht um folgenden Code:


C++:

// dieses Programm berechnet die Fläche eines Kreises

# include <iostream>
# include <math>

using namespace std;

Kreisflaeche(float);

int main()

{
   cout << " Bitte geben Sie hier den Radius des Kreises in LE ein:\n";

   float r,A;

   cin >>r;

   A=Kreisflaeche(r);

   cout << " Der Kreis hat ein Fläche von "<<A<<" Flächeneinheiten.\n";

   cin.clear();
   cin.ignore(cin.rdbuf()->in_avail());
   cin.get();

}

  Kreisflaeche(float r)
  {
    float A;
    A = (r*r)*M_PI;
    return A;
  }




Ein Kreis mit r = 1 LE hat eine Fläche von 3,141 LE². Das Programm gibt aber trotz Datentyps float in der Standardausgabe von C++ Builder X von Borland aus:

CDokumente und Einstellungen\Thomas Zettler\cbproject\Kreisfläche\windows\Release_Build\Kreisfläche.exe
Bitte geben Sie hier den Radius des Kreises in LE ein:

1
Der Kreis hat ein Fläche von 3 Flächeneinheiten.

Das ist ein unerwünschter Rundungsfehler von 0,141 Flächeneinheiten. DIESEN hätte ich eher beim Datentyp int erwartet...

Wer kann mir helfen?

Gibt man größere Radien ein ...

CDokumente und Einstellungen\Thomas Zettler\cbproject\Kreisfläche\windows\Release_Build\Kreisfläche.exe
Bitte geben Sie hier den Radius des Kreises in LE ein:

10
Der Kreis hat ein Fläche von 314 Flächeneinheiten.

wird das Ergebnis eindeutig mit dem pi - Wert von 3.141 etc. gerechnet

Danke für Eure Hilfe im Voraus

LG

kasimirle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.03.2007, 02:36 Uhr
Lensflare



komisch, dass es bei dir geht, ohne dass du einen Rückgabetyp für die Funktion Kreisflaeche angeben musst.
Bei mir musste ich auch <math> in <math.h> umändern.

Danach wurde bei mir der richtige Wert ausgegeben:
Der Kreis hat ein Fläche von 3.141 Flächeneinheiten.
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.03.2007, 07:31 Uhr
0xdeadbeef
Gott
(Operator)


Alter Compiler im Zweifel. In C90 ist eine solche Syntax sogar zulässig, die Funktion gibt dann per default int zurück. Und genau da wird der Hund auch begraben liegen - mach

C++:
float Kreisflaeche(float);


draus, und das geht. Btw, der math-Header nennt sich in C++ <cmath>
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.03.2007, 14:41 Uhr
xXx
Devil


Naja ... http://titanos.de/iso-c++/cpp:pi ^^ ...


C++:
#include <iostream>
#include <cmath>

double circular_area(const double&);

int main()
{
    std::cout << "Kreisflaechenberechnung V1.0" << std::endl;
    std::cout << "Radius (in LE): " << std::flush;
    double radius = 0.0f;
    std::cin >> radius;
    std::cout << "Der Kreis hat ein Flaeche von " << circular_area(radius) << " LE." << std::endl;

    std::cin.clear();
    std::cin.ignore(std::cin.rdbuf()->in_avail());
    std::cin.get();

    return 0;
}

double circular_area(const double& radius)
{
    return (radius * radius * std::acos(-1.0));
}
Sowas wäre doch ganz anständig
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
08.03.2007, 15:01 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


nur das std::acos ca 1000000fach soviel zeit braucht wie die konstante M_PI, aber was solls ...
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
08.03.2007, 15:41 Uhr
xXx
Devil


^^ joa bei mir findet der die konstante nur nicht ... deshalb habsch die Funktion genommen ^^
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
08.03.2007, 19:23 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


logisch - da die ebenfalls in std definiert ist...
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
08.03.2007, 21:00 Uhr
0xdeadbeef
Gott
(Operator)


Genau genommen ist M_PI ein Makro aus der BSD-Spezifikation, ISO-C++ also nicht bekannt, und auf so ziemlich keinen Fall im namespace std - der Präprozessor kümmert sich nicht um namespaces.

Einfachste Methode, um sicherzugehen:

C++:
#ifndef M_PI
# define M_PI           3.14159265358979323846
#endif


...und dann halt M_PI benutzen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
08.03.2007, 21:09 Uhr
kasimirle



Hallo, danke für die Antworten. Problem behoben.

Folge - Fragen: Warum konnte ich in der Vergangenheit in die Header - File - Zeilen von anderen Übungsprogrammen erfolgreich #include <math> statt ... <cmath> schreiben wenn <math(.h)> nicht Element von C++ ist? Ich habe nie sowas dabei von der IDE bekommen:

"file1.cpp": E2209 include-Datei 'math' kann nicht geöffnet werden in Zeile 4

Frage zum Beispiels - Code:


C++:
....bla ... bla...

double circular_area(const double&);......



wofür steht das & hinter double? Bin gerade im Lernbuch bei Zeiger. Hat das was mit Adressen zu tun im Hauptspeicher??

frage 2:


C++:
....bla
{
    std::cout << "Kreisflaechenberechnung V1.0" << std::endl;
    std::cout << "Radius (in LE): " << std::flush;

....bla



was ist std::flush? Kenne flush nur von englischen Klospülungen!

Frage 3:



C++:

....bla...
std::acos(-1.0)
....blau...





also lt. markt und technik c++ lernbuch sind nur die operatoren / mod % + * - Elemente der Bibiliothek von C++ std::.

Trigonometrie könne man nur mit math / cmath zaubern.

Was ist nun richtig?

LG kasimirle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
08.03.2007, 21:18 Uhr
Suba Esel



Das & sorgt dafür, dass du in radius herumschreiben könntest - wenn da nicht ein const stünde. In dieser Kombination ist das IMHO ziemlich sinnlos, aber egal.

Der Vergleich mit der Klospülung stimmt: std::cout ist gebuffert, d.h. das, was du anzeigst, wird zwischengespeichert. Mit std::flush leerst du den Buffer auf den Bildschirm oder wohin auch immer. Ist hier IMHO genau wie const und & ziemlich sinnlos, weil soweit ich weiß nach dem Ende des std::cout - Befehls sowieso der Buffer auf den Bildschirm geleert wird.
--
Simon
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: