Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Galera é o seguinte, o código abaixo, retorna uns valores estranhos, em notação científica,
por exemplo quando informo o anguloA e o anguloB = 45, ele exibe o cosseno da soma em
notação científica, quando na verdade deveria calcular como 0. Por favor me ajudem com
esse prolema!!!
#include <math.h>
#include <iostream>
#include <cstdlib>
using namespace std;
int main (void) {
float anguloA = 0, anguloB = 0; //anguloA e anguloB: Os angulos informados em graus.
float coss, cosd, sins, sind , radA = 0, radB = 0 ;
cout << "Informe os angulos dos arcos A e B, respectivamente em graus: \n";
cin >> anguloA >> anguloB;
radA = anguloA * M_PI/180;
radB = anguloB * M_PI/180;
coss = cos(radA)*cos(radB) - sin(radA)*sin(radB); //coss: cosseno da soma.
cout << "A soma do cosseno dos arcos A e B vale: " << coss << "\n";
cosd = cos(radA)*cos(radB) + sin(radA)*sin(radB); //cosd: cosseno da diferença.
cout << "A diferenca do cosseno dos arcos A e B vale: " << cosd << "\n \n";
sins = sin(radA)*cos(radB) + sin(radB)*cos(radA); //sins: seno da soma.
cout << "A soma do seno dos arcos A e B vale: " << sins << "\n";
sind = sin(radA)*cos(radB) - sin(radB)*cos(radA); //sind: seno da diferença.
cout << "A diferenca do seno dos arcos A e B vale: " << sind << "\n \n";
system ("pause");
}Muito obrigado pela ajuda, me ajudou muito, já resolvi o problema . !!!
Esse é o nosso velho problema com pontos flutuantes.
Isso ocorre devido ao método que é utilizado para calcula-lo (Mantissa / Base / Expoente).
Não tem como impedir esse "lixo" na memória, utilizando o padrão float atual (IEEE-754).
O que dá pra fazer, é utilizar umas técnicas para contornar isso.
Um exemplo, é fazer um comparador de valores de pontos flutuantes:
#define EPSILON 0.0001 // Define your own tolerance
#define FLOAT_EQ(x,v) (((v - EPSILON) < x) && (x <( v + EPSILON)))
Definir o valor de tolerância e subtraí-lo do valor que você quer, comparando com o outro.
Faz-se o processo contrário também. Assim, se as duas comparações informarem que um é menor que o outro, significaria dizer que ambos são iguais.
Fonte:
http://msdn.microsoft.com/en-us/library/aa271854(v=vs.60).aspx
http://pt.wikipedia.org/wiki/Ponto_flutuante
http://babbage.cs.qc.cuny.edu/IEEE-754.old/References.xhtml