paulo1205
(usa Ubuntu)
Enviado em 22/02/2018 - 14:06h
luv3 escreveu:
Bom dia, preciso de ajuda para calcular uma equacao com uma certa precisao.
No problema é pedido que calculemos a seguinte equação: 10^-8x² - 0.8x + 10^-8.
[Código suprimido por brevidade.]
Mas não consigo chegar nas raizes que foram exigidas: (0.8)10^10 e (1.25)10^-8.
Se você reconstituir a equação a partir das raízes desejadas, vai obter a equação x²-8.0000000000000000125·10^9·x+100, que não corresponde exatamente à equação original, nem mesmo multiplicando toda a equação por 10^(-8).
Eu gostaria de saber como trabalhar com melhor precisão.
Aumentar a precisão só das variáveis envolvidas no cálculo não vai ajudar pois, como se pode ver, aquelas raízes não são soluções exatas daquela equação.
O problema é que a notação de ponto flutuante com precisão finita não permite trabalhar ao mesmo tempo com números muito grandes e muito pequenos, pois o que é pequeno acaba sendo desprezado perto daquilo que é grande, por falta de bits suficientes para representá-los.
Aquele número que aparece na equação reconstituída a partir das raízes desejadas talvez já não possa mais ser representado como
long double numa arquitetura que use 64 bits para a mantissa (
N.B. no Linux é assim por padrão; no Windows com Visual Studio, o padrão é
long double ser igual a
double, com uma mantissa de apenas 52 bits, e você é obrigado a solicitar explicitamente que
long double use maior precisão), pois esses 64 bits dão uma precisão decimal de 19.2 dígitos, e o valor de
b já tem vinte dígitos (se eu não contei errado). Quando, então, você fizesse
b*b para calcular o valor de
delta, seriam necessários 40 ou 41 dígitos para calcular o valor exato, que o
long double não tem, e você iria perder precisão, e essa perda ficaria ainda mais grave após subtrair 400 (da parte
-4*a*c), e novamente não iria conseguir calcular com precisão as raízes.
Para conseguir fazer essas contas com a precisão que você quer, você teria de usar uma biblioteca ou sistema de computação com precisão arbitrária, em lugar dos tipos nativos com precisão limitada e fixa.