Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

SavioRaires

Problema com valores pequenos

Recommended Posts

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");
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.