Por que sin (45) e cos (45) dão resultados diferentes? [duplicado
Esta pergunta já tem uma resposta aqui:
A matemática do ponto flutuante está quebrada? 28 respostas Isso é algo que eu não esperava. Sei que esses números não são 100% exatos, mas não esperava ângulos complementares que apresentassem resultados diferentes desin
ecos
:
Esta função a seguir retorna0.70710678118654746000000...
sin(45 * PI / 180.0);
enquanto esta função a seguir retornar0.70710678118654757000000...
cos(45 * PI / 180.0);
so é:
0.707106781186547**46**000000... vs
0.707106781186547**57**000000...
e não apenas aqueles ...sin(1 * PI / 180.0)
também retorna um número ligeiramente diferente decos(89 * PI / 180.0)
embora devam ser os mesmo
Moreover Não é apenas umsin
vscos
problema, também é umsin
vssin
problema:sin(1 * PI / 180.0)
retorna um valor diferente desin(179 * PI / 180.0)
, novamente eles devem ser os mesmo
Eu tentei usar radianos e não graus, e há exatamente a mesma diferença, tentei usar um pequeno valor de PI, um enorme valor de PI (em torno de 100 decimais e mais) e eles ainda são diferentes, tentei usarcmath
ao invés demath.h
, Tentei usarM_PI
em vez de umPI
definido por mim.
A diferença é sempre a mesma, por volta do décimo sexto decimal. Não me interpretem mal, eu sei que nunca receberei um valor 100% preciso desses números, mas PELO MENOS eu esperava obter o mesmo valor "impreciso" desin
ecos
de ângulos complementares. O que diabos há de errado com tudo isso?
Eu preciso que eles sejam iguais, porque o programa em que estou trabalhando (um simulador de gravidade que me pediram para fazer) usa objetos que possuemdouble
(Eu também tenteifloat
) variáveis que são basicamente ângulos (graus ou radianos, tentei os dois). Essas são as direções que os objetos usam para se mover, também preciso dos ângulos para calcular as interações entre os objeto
Os ângulos mudam em todas as iterações do programa e em todas as iterações, os ângulos mudam com base nos cálculos dos ângulos da iteração anterior; portanto, se houver algum valor de ângulo minimamente errado a qualquer momento, esse erro será amplificado cada vez mais toda iteração.
O programa executa milhares e até milhões de iterações, portanto o erro do valor fica absurdamente grande! Para deixar claro, os planetas acabam se desequilibrando e tudo se torna um desastre. Estou muito bravo:
P.s. Estou no Windows 7, 32 bits.