Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá galera do imaster, quanto tempo !? últimamente tenho reservado algumas horas para me dedicar em matemática e esse é o motivo de estar fazendo este tópico.
Antes de começar o mistério, gostaria de pedir minhas desculpas aos moderadores por estar postando este tópico aqui na área do C++, na minha cabeça aqui é o melhor lugar para discutir sobre o "problema" pelo nível da linguagem e acredito eu que as ideias expostas aqui serão bem profundas.
Resolvendo algumas equações do 2º grau, me deparei com um resultado bem curioso, resultado apresentado por uma calculadora cientifica online (www.calculadoraonline.com.br/cientifica).
x² - 26x + 8 =0
Com o delta valendo 161.
X = ( -b +- raiz(delta) ) / 2a
a = 1
b = -26
c = 8
até aí tudo bem, resolvendo e simplicando para x = 13 +- raiz(161)
substituindo a incógnita x
(13 - raiz(161))² - 26(13 - raiz(161)) = -8,000000000000004
formula na calculadora online: x2(13 - raiz(161)) - (26*(13 - raiz(161)))
Certíssimo, agora vamos somar 8
-8,000000000000004 + 8 = -3,552713678800501e-15
x1 = 3,552713678800501e-15
What!?
sendo que quando vou calcular o x2, obtenho -8 corretamente.
Por quê isso acontece?, alguma coisa relacionada com o número negativo é representado em binário?
testei essa formula em outras linguagens e o resultado obtido foi o mesmo :/
Meu pecado foi no IEEE FLOATING spec.
Está valendo, obrigado pela resposta, irei prestar mais atenção na próxima :)
Vlw!
IEEE floating point spec.
delta = b^2 - 4ac = (-26)^2 - 4 * 8 = 644
x = [-b +- sqrt(delta)]/2*a = (26 +- sqrt(644))/2
x1 = 25.688577540449522
x2 = 0.31142245955047976
Aqui no Python:
>>> a = 25.688577540449522
>>> a**2 - 26*a+8
0.0
>>> b= 0.31142245955047976
>>> b**2 - 26*b+8
-3.552713678800501e-15
(repare que é 10^(-15); praticamente 0)
>>> a =decimal.Decimal((26 + 644**0.5)/2)
>>> b =decimal.Decimal((26 - 644**0.5)/2)
>>> a
Decimal('25.68857754044952201866180985234677791595458984375')
>>> b
Decimal('0.3114224595504797576950295479036867618560791015625')
>>> a**2 - 26*a
Decimal('-7.9999999999999584203425273')
>>> b**2 - 26*b
Decimal('-8.000000000000003499225519734')