Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Criticismo contra JavaScript] Explicação matemática sobre inteiro 1 mais constante ser igual a constante mais inteiro 1, sem alterar valor da constante, estar matematicamente correto #7

Open
fititnt opened this issue Nov 6, 2016 · 8 comments

Comments

@fititnt
Copy link

fititnt commented Nov 6, 2016

Esta discussão se iniciou em no grupo NodeJS onde uma pessoa começou a dizer com argumentos rasos que o design da linguagem JavaScript era ruim por motivos que não são matematicamente errados. Link: https://www.facebook.com/groups/nodejsbrasil/permalink/916210161845605/

Proponho aqui que seja adicionado ao curso maiores explicações sobre lógica matemática relacionada a soma de inteiros e constantes exibir um resultado com a soma da constante aos respectivos inteiros não é um erro de lógica.

Caso haja exercícios de aula, levar em consideração que é opcional a linguagem de programação exibir com incrementador ou decrementador o resultado da operação. O único erro de lógica seria se a constante verdadeira pudesse ser alterada.

node js brasil

@fititnt
Copy link
Author

fititnt commented Nov 6, 2016

Do link usado como referência para dizer que JavaScript é do mal:

https://dutrahacking.blogspot.com.br/2016/11/why-javascript-is-evil.html

javascript evil

@alexsmonte
Copy link

PS: minhas críticas ao JS nunca foram matemáticas hahahahaha
Tenho mtas... Sou contra como estão usando esses FWjs, sou contra a esses remendos q estão fazendo no javascript para torna-lo algo para o qual ele não foi pensando...

@fititnt
Copy link
Author

fititnt commented Nov 6, 2016

@alexsmonte Não é sobre você esse issue. Olha o resto da discussão que você vai entender.

@alexsmonte
Copy link

Eu sei q nao mas meu comentário deu origem haha hahahahaha comentário fora de contexto neh hahahahhaha

@suissa
Copy link
Member

suissa commented Jan 11, 2017

QUE TRETAAA!!!

No caso do Math.PI ele ateh aceita ++ pq não foi criada como const, porém NAO MODIFICA seu valor nunca, mas uma const criada não aceita ++, apenas + 1

Adoro as loucuras do JS, só ver o JS WAT. Isso só é ruim quando o programador não sabe dessas coisas e aí faz merda.

Até C tem seus problemas e não vai ser uma linguagem feita em menos de 10 dias que será né amiguinhos.

@robertopc
Copy link

O ++ Math.PI não é um problema. Como o @suissa falou é uma operação inplace sem modificar o valor.

O que achei grave foi a conta (0.1 + 0.2) + 0.3 == 0.1 + (0.2 + 0.3).
Fiz os testes no console. E (0.1 + 0.2) + 0.3 retorna 0.6000000000000001 e 0.1 + (0.2 + 0.3) retorna 0.6.

Só não entendi o porque desse erro na precedência. Alguém sabe porque isso acontece?

@robertopc
Copy link

robertopc commented Jan 5, 2018

A reposta do meu questionamento, foi respondida em https://stackoverflow.com/questions/588004/is-floating-point-math-broken .

Várias linguagens têm o mesmo problema, testei em JS, Python, PHP e Ruby:

$ node -p '0.1 + 0.2 == 0.3'
false
$ python -c 'print 0.1 + 0.2 == 0.3'
False
$ ruby -e 'print 0.1 + 0.2 == 0.3'
false
$ php -r 'var_dump(0.1 + 0.2 == 0.3);'
bool(false)

@MatheusMinguini
Copy link

Sobre a issue do: (0.2 + 0.1) != 0.3

Computadores não entendem o conceito de dízimas periódicas ou não-periódicas.
Por exemplo: Nós, seres humanos usamos a base 10. Ao tentarmos fazer 1/3 isso retorna 0.3333... (Aliás, qualquer número que não seja múltiplo de 3, quando dividido por 3, causa uma dízima).
Computadores tem 32 bits ou 64 bits e operam na base 2
Então, pro computador divivir por 10 é equivalente a nós humanos dividirmos por 3, porém o computador não entende o conceito de dízima

Como os computadores tem 64 bits, isso significa que eles conseguem guardar 64 dígitos binários

Ao dividir 2/10 o computador vai chegar em um número tipo 01110011100111.... atingindo os 64 bits disponíveis, ou seja, isso é um erro de floating number

Logo, pro computador, algo que tende ao infinito nunca vai ser igual a outra coisa que tende ao infinito porque ele nao consegue determinar essa equivalência

Exemplo final:
Nós humanos pensamos assim porque sabemos o conceito da significância do número
1/3 + 1/3 + 1/3 = 3/3 = 1

Mas se fossemos expressar a mesma operação em decimal, ficaria:
1/3 = 0.333...

.•. 1/3 + 1/3 + 1/3 = 0.999

0.999 é muito próximo de 1, mas não equivale, de fato, a 1

Acontece a mesma coisa com o computador, porém, ao dividir por 10

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants