EP7 Dúvidas no print

EP7 Dúvidas no print

por Vanessa Araujo Rodrigues -
Número de respostas: 15

No meu ep tenho o seguinte, ao testar a classe Astro:

>>> astro1 = Astro("Terra","blue",-192200,0,5.972e+24,6371)
>>> type(astro1.vet_pos)
<class 'vetor.Vetor'>
>>> print(astro1.vet_pos)
(-1.92e+05, 0)
>>>

No exemplo do EP, temos:

>>> type(astro1.vet_pos)
<class 'vetor.Vetor'>
>>> print(astro1.vet_pos)
(-192200,0)

No método da aceleração, eu tenho:

>>> astro3 = Astro("x","xx",0,0,1,1)
>>> vet_pos = Vetor(1,0)
>>> vet_acel = astro3.aceleracao_gravitacional(vet_pos)
>>> print(vet_acel)
(-8.65e-13, 0)

Enquanto o exemplo põe um sinal negativo no zero(?):

>>> astro3 = Astro("x","xx",0,0,1,1)
>>> vet_pos = Vetor(1,0)
>>> vet_acel = astro3.aceleracao_gravitacional(vet_pos)
>>> print(vet_acel)
(-8.65e-13,-0)

Meus prints estão corretos?

 

 

 

 

Em resposta à Vanessa Araujo Rodrigues

Re: EP7 Dúvidas no print

por José Coelho de Pina -

Meus prints estão corretos?Meus prints estão corretos?

Sim.
Estão corretos.
Os meus estavam errados e eu os corrigi no esqueleto_astro.py ontem a noite, logo após você colocar uma mensagem semelhante no fórum.
Muito obrigado por avisar.

Em resposta à José Coelho de Pina

Re: EP7 Dúvidas no print

por Emanuel Lima de Sousa -

O meu está imprimindo -0. Tem problema?

Em resposta à Emanuel Lima de Sousa

Re: EP7 Dúvidas no print

por José Coelho de Pina -

Oi Emanuel,

O meu está imprimindo -0. Tem problema?

A pergunta está meio vaga.
Você pode mostra um exemplo?

 

Em resposta à José Coelho de Pina

Re: EP7 Dúvidas no print

por Vanessa Araujo Rodrigues -

>>> astro3 = Astro("x","xx",0,0,1,1)
>>> vet_pos = Vetor(1,0)
>>> vet_acel = astro3.aceleracao_gravitacional(vet_pos)
>>> print(vet_acel)
(-8.65e-13,-0)

Talvez seja esse -0, que não foi consertado no esqueleto. O meu programa não imprime 0 com sinal de negativo. Tem problema? 

Em resposta à Vanessa Araujo Rodrigues

Re: EP7 Dúvidas no print

por Emanuel Lima de Sousa -

Exato. O meu EP tá imprimindo (-8.65e-13,-0) ao invés de (-8.65e-130). Queria saber se o corretor vai me dar errado.

Em resposta à Emanuel Lima de Sousa

Re: EP7 Dúvidas no print

por José Coelho de Pina -

Oi Emanuel e Vanessa,

O meu EP tá imprimindo (-8.65e-13,-0) ao invés de (-8.65e-130). Queria saber se o corretor vai me dar errado.

Excelente! 

Eu também queria saber.piscando
Faz sentido -0?
Se faz sentido, qual o significado.
Tente entender o que está acontecendo.
Faça o cálculo na mão de forma exata.
Imprima o valor com mais casas.
Tentem entender o que está acontecendo.
Temos ainda que entender o que é certo e errado (parece papo de lição de moral sorriso). So depois sabermos se está certo ou errado.

Vixe!
Nada como fazer uma pergunta e receber como resposta um monte de perguntas. virando os olhos

Em resposta à José Coelho de Pina

Re: EP7 Dúvidas no print

por Henrique Furia Silva -

Comigo o mesmo problema. Na hora de testar a função aceleracao_gravitacional(self, vet_pos):

vet_pos2 = Vetor(6371,0)
vet_a = astro1.aceleracao_gravitacional(vet_pos2)
print(vet_a)

Nas instruções, aparece:
        (-1.27e+05,-0)

Mas no meu programa aparece simplesmente:
        (-1.27e+05,0)

Para mim, -0 não faz sentido. Será que o "esqueleto" (ainda) tem erros?

 

Em resposta à José Coelho de Pina

Re: EP7 Dúvidas no print

por Emanuel Lima de Sousa -

Será q aparece -0 pq na verdade é -0.000000000000000001 e ele arredonda? Não mostra todas as casas? triste

Em resposta à Emanuel Lima de Sousa

Re: EP7 Dúvidas no print

por Vanessa Araujo Rodrigues -

Pois é... Nesse exemplo, específico, o vet_a = (-1,0) (nas minhas contas) e qq coisa vezes 0 é 0.

Se o exemplo do esqueleto mostra que é -0 por aproximação, não concordo, já que isso que vc postou deveria ser representado com -1 e-18 (ou 19?)

A não ser que tenha a ver com a distância 'próxima' de zero que perguntei em outro post. Não faz sentido... Meu vetores estão bem somados, subtraídos e multiplicados.... Nunca eles darão a resposta -0...

To ficando preocupada....

 

Em resposta à Emanuel Lima de Sousa

Re: EP7 Dúvidas no print

por José Coelho de Pina -

Oi Emanuel,

Será q aparece -0 pq na verdade é -0.000000000000000001 e ele arredonda?

Você consegue produzir -0 usando essa estratégia?

Em resposta à José Coelho de Pina

Re: EP7 Dúvidas no print

por José Coelho de Pina -

Oi Emanuel,

Será q aparece -0 pq na verdade é -0.000000000000000001 e ele arredonda?

Você consegue produzir -0 usando essa estratégia?

Python 3.5.2 (default, Sep 10 2016, 08:21:44) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> valor = -0.000000000000000001 
>>> print(valor)
-1e-18
>>> valor = -0.000000000000000000000000001 
>>> print(valor)
-1e-27
>>> valor = -1e-50 
>>> print(valor)
-1e-50
>>> valor = -1e-350 
>>> print(valor)
-0.0
>>> valor = -0.0
>>> print(valor)
-0.0
>>> -0.0 == 0
True
>>> -0.0 == 0.0
True
>>> -0.0 == +0.0
True
>>> valor = -1*0.0
>>> print(valor)
-0.0
>>> type(valor)
<class 'float'>
>>> valor = -1*0
>>> print(valor)
0
>>> type(valor)
<class 'int'>
>>> "%.3g"%-1e-300
'-1e-300'
>>> "%.3g"%-1e-350
'-0'
>>> 
Em resposta à Vanessa Araujo Rodrigues

Re: EP7 Dúvidas no print

por José Coelho de Pina -

Qual o resultado do programa abaixo?


def main():
    a =  11111111111111113.0
    b = -11111111111111111.0
    c =   7.511111

    x = (a + b) + c
    y =  a + (b + c)

    print("x = %.1f  y = %.1f" %(x, y))
    if x == y:
        print("x é igual a y ")
    else:
        print("x é diferente de y ")

    if  0.1 + 0.1 + 0.1 == 0.3:
        print("0.1 + 0.1 + 0.1 == 0.3 ")
    else:
        print("0.1 + 0.1 + 0.1 != 0.3 ")

#----------------------------------    
if __name__ == "__main__":
    main()
Em resposta à José Coelho de Pina

Re: EP7 Dúvidas no print

por Bruna Thalenberg -

Prof, rodei o programa e juro que não consigo entender:

x = 7.5 y = 8.0
x é diferente de y
0.1 + 0.1 + 0.1 != 0.3

A primeira parte tudo bem, até vimos em aula. Mas... como que 0.1 + 0.1 + 0.1 pode ser diferente de 0.3?! A parte que dá origem a essa linha sequer está arredondando (!?). Testei no shell e ele diz que

>>> 0.1 + 0.1 + 0.1
0.30000000000000004

???? 

 

Anexo cuidado com a burra.jpg
Em resposta à Bruna Thalenberg

Re: EP7 Dúvidas no print

por José Coelho de Pina -

Olá Bruna,

como que 0.1 + 0.1 + 0.1 pode ser diferente de 0.3?!

O que está descrito abaixo foi parcialmente copiado da página

Floating Point Arithmetic: Issues and Limitations

Essas questões são discutidas em disciplinas de Cálculo Numérico do MAP e na disciplina MAC0210 Laboratório de Métodos Numéricos.


Um computador é um instrumento e como qualquer instrumento tem sua precisão e suas limitações e blá-blá-blá.

Valores representados na base 10 (= decimal) usam os dígitos 0,1,...,9 (="range(10)").
Base 10 é o sistema de representação que usamos no dia a dia.
Por exemplo, utilizamos a representação 0.625 em ponto flutuante (=floating point) para expressarmos a fração

6 × 10-1 + 2 × 10-2 + 5 × 10-2

A fração 1/3 é representada na base 10 como a dízima periódica 0.3333....

Valores representados na base 2 (= binária) usam os dígitos binários (= bits) 0 e 1.
Valores em ponto flutuante são representados no computador na base 2.
Por exemplo, escrevemos a fração binária 0.101 para representar o valor

1 × 2-1 + 0 × 2-2 + 1 × 2-3

Assim, o valor representado pela fração decimal (=base 10) 0.625 é o mesmo da fração binária (=base 2) 0.101.

Python 3.5.2 (default, Sep 10 2016, 08:21:44) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 1*2**-1 + 0*2**-2 + 1*2**-3
0.625
>>> 1/2 + 1/8
0.625
>>> 

A seguir escreveremos (...)b para indicar que ... é a representação de um valor na base b. Como vimos, (0.625)10 == (0.101)2.

Um consequência do computador representar apenas frações binária é que muitas das frações decimais, que usamos no nosso dia a dia, não podem ser representadas exatamente. Por exemplo, a fração decimal (0.1)10 é uma dízima periódica na base 2. virando os olhos

Python 3.5.2 (default, Sep 10 2016, 08:21:44) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 0*2**-1 + 0*2**-2 + 0*2**-3 + 1*2**-4
0.0625
>>> 0*2**-1 + 0*2**-2 + 0*2**-3 + 1*2**-4 + 1*2**-5
0.09375
>>> 0*2**-1 + 0*2**-2 + 0*2**-3 + 1*2**-4 + 1*2**-5 + 0*2**-6 + 0*2**-7 + 1*2**-8
0.09765625
>>> 0*2**-1 + 0*2**-2 + 0*2**-3 + 1*2**-4 + 1*2**-5 + 0*2**-6 + 0*2**-7 + 1*2**-8 + 1*2**-9
0.099609375
>>> 0*2**-1 + 0*2**-2 + 0*2**-3 + 1*2**-4 + 1*2**-5 + 0*2**-6 + 0*2**-7 + 1*2**-8 + 1*2**-9 + 0*2**-10 + 0*2**-11 + 1*2**-12* 1*2**-13
0.09960940480232239
>>> print("%.20f" %0.1)
0.10000000000000000555

Não importa quantos dígitos 0 e 1 utilizemos, a fração decimal (0.1)10 não pode ser representada exatamente como uma fração binária. triste

1/10 = (0.1)10 = (0.00011001100110011001100110011...)2

Parando a representação com qualquer número finito de bits, nós obtemos uma aproximação do bom e velho 1/10.

Em muitos computadores, valores da classe float são aproximados usando frações binárias com um numerado de 53 dígitos binários (= bits) e com um denominador que é potência de dois.
No caso de 1/10 temos a fração 3602879701896397 / 2 ** 55.

Python 3.5.2 (default, Sep 10 2016, 08:21:44) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> x = 0.1
>>> x.as_integer_ratio()
(3602879701896397, 36028797018963968)
>>> 2**55
36028797018963968
>>> 

3602879701896397 / 2**55 é próximo, mas não é exatamente 1/10. olho roxo
É a vida. maneiro