Olá ^^
Mês passado me bati com um problema típico da vida quando estamos efetuando cálculos com números em ponto flutuante: Os erros de arredondamento.
Vcs provavelmente já empacaram com esse fenômeno em cálculos manuais. Por exemplo, se vc calcular 1/3 com duas casas decimais, obtém 0,33, certo? Porém, multiplicando novamente por 3, vc obtém 0,99 e n 1,00. Isso é terrível.
Como nós sabemos, no hardware do procesador, números são representados no sistema binário e não no decimal, então teremos erros de arredondamento quando dígitos binários são perdidos. Vc pode encontrá-los em diferente lugares além daqueles que espera. Um exemplo:
Como sabemos, 100 * 4,35 resulta em 435, mas o programa exibe 434!Código:#include <iostream> using namespace std; int main(int, char**) { double x = 4.35; int n = x * 100; cout << n << endl; // está imprimindo 434 =O return 0; }
Como a maioria dos computadores representam números no sistema binário. No sistema binário, não existe uma exata representação para 4,35, assim como não existe representação exata para 1/3 no sistema decimal. A representação usada pelo computador é ligeiramente menor que 4,35, de modo q 100 vezes este valor é ligeiramente menor que 435. Quando um valor em ponto flutuante é convertido para um inteiro, toda a parte fracionária, que é quase 1, é jogada fora e o inteiro 434 é armazenado em n.
Para evitar esse problema, vc deve sempre adicionar 0,5 a um valor positivo em ponto flutuante antes de transforma-lo para um inteiro.
Somar com 0,5 funciona, pq faz com q valores acima de 434,5 sejam valores acima de 435. Naturalmente, o compilador pode ainda emitir um aviso alertando a insegurança de atribuir um valor em ponto flutuante para uma variável inteira, mas podemos evitar isso reduzindo o warn level do compilador ou, de um jeito melhor, dar um casting com o static_castCódigo:double y = x * 100; int n = y + 0.5;
enfim é só, abraços



Responder com Citação