Program podaje błędną wartość COTANGENSA.

0

Witam!

Oto kod, jaki napisałem do obliczania cotangensa :

                       cout<<"Podaj wartosc kata: ";
                       cin>>fX;
                       fY = (1/(tan(fX*PI/180)));
                       cout<<"Cotangens "<<fX<<" stopni = "<<fY<<endl;

Niestety podaje nieprawidłowe wartości! Nie wiem gdzie sie pomylilem? Przeciez cotangens to odwrotność tangensa, tak więc jest 1/tangens ... O co chodzi ?

0

Twój kod się nie kompiluje. Brak choćby main(), iostream czy namespace'a. Jeśli chcesz, aby ktoś ci szybko odpowiedział, daj kompilujący się kod.

Po drugie, co to znaczy że źle liczy? Ile dostajesz, a ile powinno być?
Jesteś pewien, że dobrze przeliczasz stopnie na radiany? Sprawdź.

0

Mam wszystkie inty itp .. To jest tylko wycinek bardzo długiego kodu.

Wpisuję 90 i wyskakuje mi wiadomość ze cotangens 90 stopni wynosi 0.7 chyba a powinno byc 0

0

wychodzi Ci pewnie źle bo PI za małe przybliżenie masz

0

Pomyśl, że tangens z 90 stopni to tzw. blada dupa (bo się nie da tego obliczyć). 1 / blada dupa = cokolwiek, więc wynik jest poprawny.

0

Tangensa tak ale ctg da sie

0
#include <iostream>
#include <cmath>
#include <iomanip>

using namespace std;

int main()
{
	double const PI=3.14159265358979323846264338327950288419716939937510;		//Stała w przybliżeniu małym XD
	double kat;
	cout << "Podaj miare kata: ";
	cin >> kat;	//Domyslnie podany w stopniach
	//Przeliczenie na radiany;
	double rad=(kat*PI)/180;
	cout << "Podaj co chcesz obliczyc: " << endl;
	cout << "1.Tangens" << endl;
	cout << "2.Cotangens" << endl;
	cout << "3.Sinus" << endl;
	cout << "4.Cosinus" << endl;
	int OPCJA;
	cin >> OPCJA;
	cout << endl;
	cout << endl;
	if(kat==90)//Warunek specjalny :)
	{
		switch(OPCJA)
		{
		case 1: {cout << "Tangens kata: "<< kat << " wynosi: nie ma takiego :)"<< endl;break;}
				case 2: {cout << "Cotangens kata: "<< kat << " wynosi: 0"<< endl;break;}
				case 3: {cout << "Sinus kata: "<< kat << " wynosi: 1"<< endl;break;}
				case 4: {cout << "Cosinus kata: "<< kat << " wynosi: 0"<< endl;break;}
				default: cout << "Zla opcja sproboj znow!" << endl;
		}
	}
	else
	{
	switch(OPCJA)
	{
	case 1: {cout << "Tangens kata: "<< kat << " wynosi: "<< setprecision (14) << tan(rad)<< endl;break;}
	case 2: {cout << "Cotangens kata: "<< kat << " wynosi: "<< setprecision (14) << 1/(tan(rad))<< endl;break;}
	case 3: {cout << "Sinus kata: "<< kat << " wynosi: "<< setprecision (14) <<  sin(rad)<< endl;break;}
	case 4: {cout << "Cosinus kata: "<< kat << " wynosi: "<< setprecision (14) << cos(rad)<< endl;break;}
	default: cout << "Zla opcja sproboj znow!" << endl;
	}
	}
	system("PAUSE");
	return 0;
}

jak byc o masz :)

0

A zamiast takiego kombinowania wystarczy użyć innego wzoru na cotangens - ctg x = cos x / sin x

0

a gdybyś tak dzielił 1.0f przez tan(cos tam) ? ;-)

0

Nic nie da - int/double daje double. Tu całym problemem jest tangens z 90 stopni.

0
Fanael napisał(a)

A zamiast takiego kombinowania wystarczy użyć innego wzoru na cotangens - ctg x = cos x / sin x

ale to za dużo obliczeń łatwiej 1/tan :P

TANGENS 90 stopni nie istnieje luknijcie do książek!

0

Troche matematyki i sie ludzie gubią...
ctg 90 stopni wynosi co prawda 0, ale dlatego że tg 90 stopni wynosi nieskończoność (jest tam asymptota). A jak wiadomo granica wyrażenia 1/niesk daje nam 0. Jeśli w programie liczysz tg 90 to wynik będzie błędny, bo nie może ci zwrócić nieskończoności. W związku z tym 1/wynik też będzie błędne.
Korzystanie z sin/cos i cos/sin też nie rozwiązuje problemu bo przecież tam działa ta sama zasada 1/niesk.
Musisz przypadki asymptot rozpatrywać osobno i już.

0
Shalom napisał(a)

Troche matematyki i sie ludzie gubią...
ctg 90 stopni wynosi co prawda 0, ale dlatego że tg 90 stopni wynosi nieskończoność (jest tam asymptota). A jak wiadomo granica wyrażenia 1/niesk daje nam 0. Jeśli w programie liczysz tg 90 to wynik będzie błędny, bo nie może ci zwrócić nieskończoności. W związku z tym 1/wynik też będzie błędne.
Korzystanie z sin/cos i cos/sin też nie rozwiązuje problemu bo przecież tam działa ta sama zasada 1/niesk.
Musisz przypadki asymptot rozpatrywać osobno i już.

Co ty Shalom za bajki opowiadasz. tg 90 nie istnieje (funkcja nie jest w tym punkcie okreslona) i nie ma tam zadnej asymptoty, recze glowa. asymptoty sa gdy argument funkcji tg zbliza sie do wartosci 90 stopni z lewej lub prawej strony ale w pkt. 90 stopni (pi/2 radianow) wartosc funkcji tg NIE ISTNIEJE.
ctg 90 = 0.
1/ctg(90) --> "divide by zero error" .
Shalom --> back to school :-)
</u></i>

0

@ciemnosc, niestety musisz się rozstać z głową (możesz mi przesłać pocztą, wysuszę i zrobię z niej stojak na ołówki). tg(900) co prawda nie istnieje, ale funkcja tg ma w punkcie 900 asympotę pionową.

0
bogdans_niezalogowany napisał(a)

@ciemnosc, niestety musisz się rozstać z głową (możesz mi przesłać pocztą, wysuszę i zrobię z niej stojak na ołówki). tg(900) co prawda nie istnieje, ale funkcja tg ma w punkcie 900 asympotę pionową.

dobra bogdans, nie czepiajmy sie terminologii, "myśli kłamią głosowi, a głos myślom kłamie".
faktycznie, tak to sie nazywa, ze "wykres ma w pkt. x asymptote pionowa" ale de facto nie ma tam zadnej asymptoty, bo ta asymptota zbliza sie do tego punktu x ale nigdy go nie osiaga, o to mi chodzilo

0

Od kiedy asymptota sie do czegoś zbliża? o_O Asymptota przeciez nie jest częścia wykresu funkcji!
Mnie zawsze uczono ze wykres funkcji zbliza się do asymptoty, w tym przypadku dla argumentów zbliżających się do punktu gdzie jest asymptota pionowa, wykres funkcji zbliża się do asymptoty, a wartości funkcji silnie rosną/maleją i "uciekają" do nieskończoności, no ale może teraz was w gimnazjum inaczej uczą. Oczywiście to był skrót myślowy ze wartośc funkcji w tym punkcie to jest nieskończoność. Miałem na myśli granice owej funkcji w tym punkcie.

0

@ciemnosc, de facto to nie znasz/nie rozumiesz pojęcia asymptoty.
@Shalom, twój skrót myślowy (tg(\frac{\pi}{2}) = \lim_{x\rightarrow\frac{\pi}{2}} tg(x)), ma poważną wadę: granica \lim_{x\rightarrow\frac{\pi}{2}} tg(x) nie istnieje.

0

Obustronna oczywiście nie, ale istnieją granice prawo i lewo-stronna, które wynoszą +-nieskończoność :)
Chyba mały offtop robimy :D

0

Heh, a no właśnie Szalomie, + i - nieskończoność. A to znaczy, że mamy 2 wyniki do wyboru: + i -0 ;) Wbrew pozorom to naprawdę są różne wyniki, bo float i double bit znaku trzyma oddzielnie. Czyli można zaprezentować 0 dodatnie i ujemne, i są to reprezentacje odmienne binarnie :D To nie system U2, że zero jest zerem, i mamy jedno najzersze zero ;)

0

Nie zapominajmy, że stała pi, jakkolwiek by nie była zdefiniowana, wcale nie wynosi π tylko np. 3,14159265358979. Ponieważ wykres funkcji tg jest w 3,14159265358979/2 bardzo stromy (blisko asymptoty), to niewielka zmiana tej wartości skutkuje znaczną zmianą wyniku. W rezultacie to co otrzymujemy jest kompletnym totolotkiem, tylko nie wartością funkcji.

Do autora wątku: licz ctg(x) = cos(x)/sin(x)

0

Ale takie liczenie cotangensa raczej niewiele da, skoro autor nie pomyślał, aby wykluczyć warunkiem asymptotę tangensa, to pewnie z cotangensem będzie to samo.

0
Gelldur napisał(a)
double const PI=3.14159265358979323846264338327950288419716939937510;

to i tak jest rzutowane na double, który aż takiej dokładności nie ma... to tak odnośnie metod obliczniowych

jeśli zależy ci na dokładnych obliczeniach to możesz użyć GSL. Tu jest po kolei opisane jak policzyć

http://www.gnu.org/software/gsl/manual/html_node/Complex-Numbers.html

a to tak na szybko :)

cout<<"Podaj wartosc kata: ";
cin>>fX;
fY = (1.0/(tan((double)fX*PI/180.0))); // tu dopisalem po 180.0 i po 1.0 i rzutowanie na doubla fX
cout<<"Cotangens "<<fX<<" stopni = "<<fY<<endl;
0

wiem ,że takiej dokładności nie ma ale miałem pod rękom więc wkleiłem i nie będę liczył 16 miejsca po przecinku :P

1 użytkowników online, w tym zalogowanych: 0, gości: 1