Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » sinus ohne math.h berechnen

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
11.12.2004, 17:30 Uhr
newbie2oo4



Hallo,

hab leider die Aufgabenstellung etwas fehlintepretiert, bei mir muss
man den Wert in Grad eingeben, welcher dann ins Bogenmaß umgewandelt
wird. Unter Genauigkeit hatte ich eigentlich die Anzahl der
Rechenschritte verstanden, wenn man bei mir z.B. 30 eingibt wird 30 mal
das x^n ausgerechnet und dann abgebrochen.

Die Aufgabenstellung lautet aber: "es soll der sinus einer zahl
berechnet werden, wie das geht steht in jeder Formelsammlung!! Also
keine Standart c++ funktion benutzen, sondern ein Programm das mit
Hilfe von Funktionsaufrufen die Fakultät. die Hochzahl und den Sinus
berechnet. Diese 3 Sachen sind auszuprogrammieren!!!! Näheres gibts
Montags bzw. Donnerstags während des Praktikums!! Sinnvolles
Abruchkriterium für die Genauigkeit der Berechnung 0.000001! Das ganze
soll dann auch noch mit der in C++ Standartfunktion verglichen
werden!"

Vielleicht kann mir jemand weiterhelfen, hab mein Program mal
angehängt.

Gruß Martin



C++:
#include <iostream.h>
#include <stdio.h>

#define pi 3.1415926535897932384626433832795

double dFakultaet( double); //funktionsdeklaration bzw. funktionsprototyp
double dExponent( double,  double);
double dSinus( double,  double);

void main() { //hauptfuntion
     double dWinkel;
     double dGenauigkeit;
     double dErgebnis;

    cout<<"Geben sie den Winkel ein"<<endl;
    cin>>dWinkel;

    cout<<"Geben sie die Genauigkeit ein"<<endl;
    cin>>dGenauigkeit;

    dErgebnis = dSinus(dWinkel, dGenauigkeit);

//    cout<<"Sinus = "<<dErgebnis<<endl;
    printf("Sinus = %5.20f\n", dErgebnis);
    
}

double dFakultaet( double dN) {        //berechnung fakultät
     double dM = 1;
     double dF = 1;

    while(dM <= dN) dF *= dM++;        

    return(dF);
}

double dExponent(double dBasis, double dExponent) {
     double dErgebnis = dBasis;
    
    if(dBasis == 0) return(0); //wenn basis 0
    if(dExponent == 0) return(1); //wenn exponent 0
    
    for(; dExponent > 1; dExponent--) dErgebnis = dErgebnis * dBasis;
    return(dErgebnis);
    
}

//    Funktion:        dSinus
//    Beschreibung:    xxx
//
//    IN:
//    OUT:

double dSinus( double dWinkel,  double dGenauigkeit) {
     double dErgebnis = 0;
     double dTemp = 1;
     double dWert = 1;
    int dZaehler;

    dWinkel = dWinkel * (2*pi/360);  //Umrechnung ins Bogenmaß

    if(dGenauigkeit == 0) dGenauigkeit = 1;//fehlerfall wenn genauigkeit = 0
    
    for(dZaehler = 1; dZaehler <= dGenauigkeit; dZaehler++) { //schleife für genauigkeit
        dTemp = dExponent(dWinkel, dWert) / dFakultaet(dWert); //formelteil nicht vorzeichenbehaftet

        if(dZaehler % 2) dErgebnis = dErgebnis + dTemp;    //vergleich auf ungerade, ist zahler für genauigkeit ungerade wird addiert
        else dErgebnis = dErgebnis - dTemp;    //vergleich auf gerade
        dWert += 2; //damit nur ungerade exponenten und fakultäten, also x hoch 3, x hoch 5, ...
    }
    return(dErgebnis);
}


Dieser Post wurde am 11.12.2004 um 17:44 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
11.12.2004, 18:17 Uhr
derphilipder



Und was genau ist jetzt Dein Problem?

Mit Genauigkeit ist wohl zu verstehen, daß sich der Wert gegenüber dem vorigen Durchlauf um nicht mehr als 0.000001 geändert hat.
--
Konfuzius says: "A man who goes to bed with an itchy asshole is a man who wakes up with stinky finger!"
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
11.12.2004, 18:42 Uhr
newbie2oo4



Das Abbruchkritterium sollen z.B. die 0.000001 sein so wie du gesagt hast.
Mein Problem ist das ich nicht weiß wie ich das machen muss.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
11.12.2004, 18:48 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


www.fun-soft.de/showtopic.php?threadid=2823
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
11.12.2004, 18:50 Uhr
derphilipder



Naja, Du prüfst einfach in jedem Durchlauf, ob das was Du dazuaddierst grösser als dieser Wert ist. Wenn nicht --> break;
--
Konfuzius says: "A man who goes to bed with an itchy asshole is a man who wakes up with stinky finger!"
 
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: