Diferença ente Outputs de Funções Matemáticas

1. Diferença ente Outputs de Funções Matemáticas

Luciano Magrini
magriniluciano

(usa Ubuntu)

Enviado em 20/06/2018 - 08:31h

Prezados,
sou iniciante em C e estou tentando "traduzir" um código de C para Python, minha zona de conforto.
Estava comparando as saídas de um e de outro e percebi que estavam bem diferentes apesar de eu ter certeza que os códigos já são equivalentes.
Daí, fui para a velha técnica dos "printfs" em cada linha do código para achar o problema e me deparei com algo bem curioso (pelo menos para mim, que não entendo de C a fundo).

No programa em C faz-se repetidas vezes o cálculo do seno de um certo argumento x da seguinte forma: primeiro se calcula o argumento x (que depende de alguns inputs) e armazena numa variável do tipo float. Na sequência, calcula-se o seno. É como está feito para o "sin1" no código que transcrevo abaixo. Em Python eu fiz o cálculo direto: joguei o argumento x dentro da função seno sem uma variável intermediária. É como está feito para o "sin2" no codigo abaixo. Mas aqui está o problema. Os outputs são muito diferentes (também abaixo) e do ponto de vista matemático o primeiro está correto mas o segundo não. O que pode explicar essa diferença?

Grato a todos.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(){
float sin1, sin2, variable1, variable2;
long i;

for (i = 0; i < 10; i++){
variable1 = 2.0*M_PI*i;
sin1 = sin(variable1);
sin2 = sin(2.0*M_PI*i);
printf("sin1 = %.20g\n", sin1);
printf("sin2 = %.20g\n", sin2);
}

exit(-1);}


Output:
sin1 = 0
sin2 = 0
sin1 = 1.7484555314695171546e-07
sin2 = -2.4492937051703357089e-16
sin1 = 3.4969110629390343092e-07
sin2 = -4.8985874103406714178e-16
sin1 = 4.7699522554012219189e-08
sin2 = -7.3478805861154150927e-16
sin1 = 6.9938221258780686185e-07
sin2 = -9.7971748206813428356e-16
sin1 = -5.5628368045290699229e-07
sin2 = -1.2246467996456086511e-15
sin1 = 9.5399045108024438377e-08
sin2 = -1.4695761172230830185e-15
sin1 = -1.1602668337218347006e-06
sin2 = -1.7145055406796757928e-15
sin1 = 1.3987644251756137237e-06
sin2 = -1.9594349641362685671e-15
sin1 = 1.4309856055660929997e-07
sin2 = -2.2043642817137429346e-15


  


2. Diferença ente Outputs de Funções Matemáticas

MAURO BRITIVALDO
AnsiC

(usa Kali)

Enviado em 03/09/2018 - 10:49h

Olá, tudo bem?


Então, são situações diferentes com tipos diferentes.
Para homogenização dos resultados use os tipos recomendados no cabeçalho da função: tanto na entrada, quanto para a saída. Esse tipo é: Double

Com relação ao Python que é um linguagem de tipagem avançada, essa "homogenização" consciente de tipos é feita automaticamente para evitar downcasting (perca de dados) isso porque a linguagem é avançada nesse quesito, quando não intencional.


Okay !? Tchau






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts