problemas com representatividade de números pequenos arduino UNO

Olá Senhores,

me deparei com a seguinte situação, que não consegui encontrar uma forma de resolver. Em determinada parte do programa ocorre um cálculo onde faço uma divisão como o exemplo:
x = 0,06/1818596352
deveria me retornar = 3,299247792618469e-11 porem retorna 0
já tentei com diversas variáveis (double, float, long)

Alguém tem uma sugestão de como contornar isso?

obrigado!

Exibições: 1097

Responder esta

Respostas a este tópico

Oi GO, boa tarde.

realmente o valor é muito pequeno:  x = 0,06/1818596352    ---->   x =  0,0000000000329924779.

Se voce está usando println para ver este numero, e deverá escrever assim:  

float x =  0.06/1818596352;

Serial.println(x, 20);

delay(200);   //  Nao mandatorio

Testei aqui e funcionou.

Rui

GO, 

anexe, " como arquivo"" , o seu código pra que eu possa entende-lo e sugerir modificações.

Rui

Olá Giliard!

Você já testou imprimir os valores das variáveis intermediárias:

realPower , e C=376.99 *sq(supplyVoltage) ?

Se uma delas for zero, F também será zero. use Serial.println com 20 casa decimais para ter certeza.

Pode ser que a lib do calibrador não esteja trazendo os resultados corretos.

Obs: no UNO, double e float possuem a mesma precisão.

Somente uma observação:

Valores desse tipo não são problema para a linguagem do Arduino.

O tipo float suporta 34 casas decimais.

O que pode estar acontecendo é que a outra fórmula que está recebendo esse valor pode ter alguma variável do tipo int.

O problema da linguagem do Arduino, diferente de outras versões do C/C++, é que ela faz o cast automático do float para o int.

Por exemplo:

int x = 1;

float y = 0.000034;

x = y;

No final desse código, x vai valer 0, pois o Arduino faz a conversão automática.

Já, na linguagem Java ou outras variantes do C, a última atribuição geraria um erro em tempo de compilação por tipos incompatíveis.

Por isso tome cuidado na atribuição de tipos no Arduino.

Oi GO, boa noite.

Testei um code com base naquele pedaço que você postou.

Tive que fazer pequena modificações para testa-lo e "chutar" alguns valores.

Ãh, como F retornava, se a função não tinha nem retorno e o titulo inciava com void?

Funcionou e imprimiu o resultado esperado  " 0.00001370139598846435 ".

Faço minha as palavras do grande amigo JAC:  " no UNO, double e float possuem a mesma precisão."

Como você não postou o código completo com receio de copia-lo,(kkkkkkk),  segue o meu completo .

É claro, deu mais trabalho do que se tivesse ele todo, mas.....

Numero_Double.ino.

Rui

Anexos

Rui, você reparou que o Giliard usou vírgulas no lugar do ponto decimal?

Como isso passou pelo compilador? Não posso testar agora.

Se for isso, vai dar zero mesmo.

Oi GO, 

veja o resultado usando seus valores:

Não retornou 0 em F.


        B 12.50
        C 18246316.0
        A 0.0599999952
        F 0.000000003288335
        E 0.800
     Cap 0.000000002630668
    Valor 0.000000003288335

com o código anexo.

Nestes valores:  

ten-se que usar ponto no lugar de virgula  ( "," é separador milhar, e ponto separador decimal).

double B = 12,50
double C = 18246316;
double A = 0,06;
double F = A / C; //aqui ocorre o problema pois F retorna 0
double E = 0,8;

capacitor = F * E; // consequentemente aqui ocorre a multiplicação pelo zero falso

Rui

Anexos

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço