lvcky Temat założony przez niniejszego użytkownika |
Problem z programem do wyliczenia funkcji sinus » 2013-10-28 23:23:29 Przesyłam kod: FUNKCJA: float stopnieNAradiany( float wartosc ) { float wynik; wynik =( wartosc / 180 ) * 3, 14; return wynik; }
float sinus( float wartosc, int iteracje ) { float wynik = 0; int a = - 1, b; for( int n = 0; n < iteracje; n++ ) { b =( 2 * n ) + 1; wynik = wynik + potega( a, n ) *( potega( wartosc, b ) / silnia( b ) ); } return wynik; } Wywołanie funkcji: case '3': { int wybor, iteracja; double wartosc, wynik; cout << "Podaj wartosc dla jakiej obliczyc sinus "; cin >> wartosc; cout << "Podaj ilosc iteracji "; cin >> iteracja; wartosc = stopnieNAradiany( wartosc ); wynik = sinus( wartosc, iteracja ); cout << "sinus (" << wartosc << ") wynosi: " << wynik << endl; system( "pause" ); system( "cls" ); break; } Problem mam taki, ze dla niektórych wartości kąta wynik wynosi 0 np dla sinusa 14 stopni i iteracji 10 wynik jest zero, a dobrze wiadomo, ze to nieprawidłowy wynik. Co tutaj zmienic zeby to działało prawidłowo? |
|
docentpp |
» 2013-10-28 23:38:20 Być może dlatego,że mieszasz typy rzeczywiste. Double i float mają inne dokładności.
Jak wygląda silnia ?
Daj cały kod . |
|
lvcky Temat założony przez niniejszego użytkownika |
» 2013-10-28 23:43:44
#include "stdafx.h" #include <iostream> #include <stdio.h> #include <math.h> #include <conio.h> #include <stdlib.h> #include <ctype.h>
using namespace std;
float poletrojkata( float a, float b, float c ) { float wynik; wynik =( sqrt(( a + b + c ) *( a + b - c ) *( a - b + c ) *( - a + b + c ) ) ) / 4; return wynik; }
float silnia( int liczba ) { float wynik = 1; if( liczba != 1 || liczba != 0 ) { for( int i = 2; i <= liczba; i++ ) { wynik = wynik * i; } } return wynik; }
float potega( int liczba, int potega ) { float wynik = 1; if( potega != 0 ) { for( int i = 0; i < potega; i++ ) { wynik = wynik * liczba; } } return wynik; }
double stopnieNAradiany( double wartosc ) { double wynik; wynik =( wartosc / 180 ) * 3, 14; return wynik; }
double sinus( double wartosc, int iteracje ) { double wynik = 0; int a = - 1, b; for( int n = 0; n < iteracje; n++ ) { b =( 2 * n ) + 1; wynik = wynik + potega( a, n ) *( potega( wartosc, b ) / silnia( b ) ); } return wynik; }
int zamianaliter( char * tab, int n ) { for( int i = 0; i < n; i++ ) { char tymczasowa; tymczasowa = tab[ i ]; if( tymczasowa >= 'A' && tymczasowa <= 'z' ) { if( tymczasowa >= 'A' && tymczasowa <= 'Z' ) { tymczasowa = tymczasowa + 32; tab[ i ] = tymczasowa; } else { tymczasowa = tymczasowa - 32; tab[ i ] = tymczasowa; } } else { tab[ i ] = tymczasowa; } } return n; }
int _tmain( int argc, _TCHAR * argv[] ) { char wybor; while( 1 ) { cout << " MENU:\n" << endl; cout << " (1) - Zadanie 1 (Oblicz wartosc potegi)" << endl; cout << " (2) - Zadanie 2 (Oblicz wartosc silni)" << endl; cout << " (3) - Zadanie 3 (Oblicz wartosc sinus)" << endl; cout << " (4) - Zadanie 4 (Oblicz pole trojkata)" << endl; cout << " (5) - Zadanie 5 (Zamiana wielkosci znakow)" << endl; cout << " (x) - Jesli chcesz zakonczyc prace z programem\n\n" << endl; cout << " Wybierz co chcesz zrobic" << endl; cin >> wybor; switch( wybor ) { case 'X': { return 0; } case 'x': { return 0; } case '1': { int liczba, potega1; cout << "Podaj liczbe, ktora chcesz potegowac: " << endl; cin >> liczba; cout << "Podaj potege (wykladnik): " << endl; cin >> potega1; liczba = potega( liczba, potega1 ); cout << "Twoja liczba to: " << liczba << endl << endl; system( "pause" ); system( "cls" ); break; } case '2': { float liczba; cout << "Podaj liczbe z ktorej chcesz wyliczyc silnie "; cin >> liczba; liczba = silnia( liczba ); cout << "silnia wynosi " << liczba << endl << endl; system( "pause" ); system( "cls" ); break; } case '3': { int wybor, iteracja; double wartosc, wynik; cout << "Podaj wartosc dla jakiej obliczyc sinus "; cin >> wartosc; cout << "Podaj ilosc iteracji "; cin >> iteracja; wartosc = stopnieNAradiany( wartosc ); wynik = sinus( wartosc, iteracja ); cout << "sinus (" << wartosc << ") wynosi: " << wynik << endl; system( "pause" ); system( "cls" ); break; } case '4': { float a, b, c; float wynik; cout << " Wprowadz dlugosc boku a:\n" << endl; cin >> a; cout << " Wprowadz dlugosc boku b:\n" << endl; cin >> b; cout << " Wprowadz dlugosc boku c:\n" << endl; cin >> c; wynik = poletrojkata( a, b, c ); cout << "Pole trojkata wynosi:" << wynik << endl; system( "pause" ); system( "cls" ); break; } case '5': { int n = 100, zmienna = 0; char tablica[ 100 ]; cout << "Podaj znaki do zapisania : "; cin >> tablica; zamianaliter( tablica, n ); cout << tablica << endl; } cout << "To juz ostatnie zadanie jakie wykonuje program, dziekuje za skorzystanie z programu" << endl << endl; system( "pause" ); system( "cls" ); break; } } }
|
|
Monika90 |
» 2013-10-28 23:48:53 pi nie jest równe 3. |
|
lvcky Temat założony przez niniejszego użytkownika |
» 2013-10-28 23:52:53 Nadal nie wiem co poprawić :) |
|
Monika90 |
» 2013-10-29 00:38:12 Funkcja potega obcina cześć ułamkową aragumentu.
Poza tym, przy obliczaniu silni i potęgi można wykorzystać ich wartości z poprzedniej iteracji. |
|
lvcky Temat założony przez niniejszego użytkownika |
» 2013-10-29 00:48:13 Z wyświetlaniem po przecinku sobie poradziłem :) To powiedz mi jak prawidłowo usunąc tą iteracje. Bo kiedy ja usuwam to mam błąd, ze funkcja potrzebuje 2 argumentów :)
|
|
akwes |
» 2013-10-29 15:28:36 double stopnieNAradiany( double wartosc ) { double wynik; wynik =( wartosc / 180 ) * 3, 14; return wynik; }
3,14 != 3.14 |
|
« 1 » |