Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Sin 180 und 360, cos 90 270 ungleich 0 was tun ????

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 <
000
25.11.2005, 15:40 Uhr
~senator
Gast


Hallo
Ich habe ein kleines Problem kann aber ums verrecken nicht herrausfinden warum? Also ich stell den Quellcode mal ein, das Programm soll einfach den Sinus und den Cosinus der Winkel die ich eingebe berechnen. Gebe ich allerdings für den sinus 180 oder 360 Grad ein so spuckt der rechner nicht null aus sondern eine Zahl die sehr klein ist z.b 1,66666e-016, das gleiche spiel mit dem cosinus bei 90 und 270 grad.....Hat irgendjemand ne idee worans liegen kann......falschen variablentyp verwendet .......oder ungenauigkeiten in der umrechnung von grad in radiant???

sorry ich weiss nicht wie man den quellcode in so ein nettes kästchen bekommt..mal schaun vielleicht klappts.


C++:

#include <iostream.h>
#include <math.h>
#include <stdio.h>
#define PI 3.141592653589793238462643383279


void main()
{
double w1,w1a,w2,w3,wert,wert2;


    cout<<"gib winkel ein!:";
    cout<<"\n";
    cin>>w1;
    cout<<"\n";
    w2=(PI/180);cout<<"PI/180=    "<<w2;
    cout<<"\n";
    w1=(PI/180)*w1;cout<<"w1 in rad=    "<<w1;
    cout<<"\n";

    cout<<"\n";
    wert=sin(w1);
    cout<<"\n";
    cout<<"Sinus von w1:  "<<wert;
    cout<<"\n";
    cout<<"\n";

    cout<<"gib winkel w1a ein!:";
    cout<<"\n";
    cin>>w1a;
    cout<<"\n";
    w3=(PI/180);cout<<"PI/180=    "<<w3;
    cout<<"\n";
    w1a=(PI/180)*w1a;cout<<"w1a in rad=    "<<w1;
    cout<<"\n";
    cout<<"\n";
    wert2=cos(w1a);
    cout<<"\n";
    cout<<"cos von w1a:  "<<wert2;
    cout<<"\n";
    cout<<"\n";



}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
25.11.2005, 15:49 Uhr
0xdeadbeef
Gott
(Operator)


Die Funktionen rechnen im Bogenmaß, nicht im Gradmaß, und...naja, Pi ist für einen Computer ziemlich schwierig exakt darzustellen. Fließkommazahlen sind halt nicht exakt.

In diesem Fall empfiehlt es sich, vor der Ausgabe auf eine bestimmte Anzahl Stellen zu runden. Wenn du mathematisch exakte Ergebnisse haben willst, benutz am besten eine fertige algebraische Umgebung wie maxima, axiom, maple, mathematica, mupad oder so.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
25.11.2005, 19:28 Uhr
~senator
Gast


Mhhh o.k.
aber wie kann ich denn z.B. vor der Ausgabe die Zahlen runden???
Das nächste Problem ist, dass ich mit den errechneten Werten weiterrechnen muss......heisst also wenn ich kürze/runde hacke ich die letzten zahlen für die ausgabe ab.....aber wenn ich mit den errechneten Zahlen weiterrechnen möchte habe ich ja wahrscheinlich weiterhin diese kleine Zahl???Oder? Nun möchte ich aber das meine errechnete Zahl auch für weitere Rechnungen 0 ist, habe also eine If(wert<=1,0e-8) bedingung eingefügt und gesagt er soll wert also Null setzen...tut er aber nicht...keine Ahnung warum. Gibt es da noch eine andere Möglichkeit die Zahl für Ausgabe und anschliessende Rechnung so zu kürzen , dass ich dann tatsächlich für sin von Pi 0 rausbekomme.

Die genannten Umgebungen sind so etwas wie Umwicklungsumgebungen( so wie Visual Studio z.B.) oder sind das Bibliotheken? Sorry ich bin auf dem Gebiet nicht sehr bewand deswegen frage ich.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
25.11.2005, 21:42 Uhr
0xdeadbeef
Gott
(Operator)


Naja, im Fall von Sinus und Cosinus schwankt der Wert zwischen -1 und 1, also kann man auf 8 Stellen runden, indem man

C++:
double wert_gerundet = round(wert * 1e8) / 1e8;


schreibt. Das geht auf x86 mit bis zu 15 Stellen. math.h muss includet sein, und der Compiler muss zumindest Teile von C99 kennen - ansonsten lässt sich das auch mit

C++:
double wert_gerundet = floor(wert * 1e8 + 0.5) / 1e8;


emulieren. math.h brauchste hierfür auch, aber das ist bereits Teil von C89. Wenn es nur um die Ausgabe geht, kann es aber sinnvoller sein, mit IO-Manipulatoren zu arbeiten, in diesem Fall std::setprecision und std::fixed. Beispiel:

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

int main() {
  double d = std::sin(3.1415926);

  std::cout << d << std::endl;
  std::cout << std::fixed << d << std::endl;
  std::cout << std::fixed << std::setprecision(15) << d << std::endl;
}


Das gibt bei mir

Code:
$ ./a.out
5.35898e-08
0.000000
0.000000053589793


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 25.11.2005 um 21:45 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: