Apenas um tipo de número no design do idioma

8

Atualmente, estou aprendendo sobre a construção do compilador e o design de idiomas e estou pensando em quais tipos de dados nativos quero oferecer no meu idioma. Agora, existem muitas línguas que fazem uma distinção entre números inteiros e reais. No entanto, lembro-me de assistir a uma palestra de Douglas Crockford na qual ele disse:

Ter um único tipo de número no sistema significa que você não pode cometer um erro escolhendo o tipo de número errado

Ele também mencionou que recomenda uma representação numérica diferente da IEEE-754 comumente usada (por favor, corrija-me se estiver errado), nomeando o DEC64. Daí a minha pergunta: para uma linguagem de uso geral com foco principalmente educacional, que representação numérica devo usar?

EDIT: Com foco educacional, estou falando do meu próprio progresso em aprender sobre compiladores, não em educar os outros.

Niklas Vest
fonte
4
Não há resposta certa aqui. Para fins educacionais, eu recomendaria o uso de decimais de precisão arbitrários (por exemplo, Javas BigDecimal e BigInteger). Tem toda a flexibilidade que se pode pedir, evita ter que explicar os erros de arredondamento logo no início e se comporta da mesma maneira que os alunos das calculadoras estão acostumados.
Marstato 29/05
5
A pergunta começa a perguntar sobre tipos de números e depois muda para representações numéricas . O que é meio confuso, possivelmente também confuso. Além disso, é provável que até mesmo respostas baseadas em opiniões sejam errôneas se você não puder esclarecer o foco educacional mencionado: será um idioma para as pessoas que aprendem a programar (como Pascal), um projeto para o seu próprio aprendizado? educação, um idioma a ser usado pelos pequenos aprendendo a contar, ...?
High Performance Mark
1
Obrigado, editei a pergunta. Eu estou mencionando ambos os tipos de números e representações porque eu firgured talvez alguém poderia apontar-me a direção certa para ambos os meus problemas :)
Niklas Vest
Lembre-se de que ser capaz de eliminar uma classe de bugs não significa necessariamente que o número líquido de bugs diminua.
Whatsisname 31/05
1
"que tem um foco principalmente educacional" Como a ciência da computação educacional? Como um problema que você encontrará do ponto de vista do design de linguagem é o suporte a operadores binários como mudanças aritméticas e lógicas. (Isso também se aplica às regras gramaticais de precedência do operador se você incluir operadores binários para aprender como os idiomas lidam com as coisas). Se você não se importa com isso, pode usar um único tipo de dados. (JS possui um único tipo "Number" se você quiser ver uma maneira estranha de lidar com as coisas).
Sirisian

Respostas:

11

Em geral, temos uma representação numérica diferente porque eles têm pontos fortes e fracos diferentes, seja velocidade, precisão ou alcance. Além disso, esse deve ser o caso, porque não podemos representar todos os números reais com memória finita; sempre temos que escolher alguns que não podemos representar exatamente.

A citação de Doug Crockford que você tem é muito idiota; se você pode escolher apenas uma representação, OK, você não pode escolher a incorreta, mas também não pode escolher a correta. ou seja, sua única opção funcionará para alguns usos, mas não para todos.

É verdade que algumas representações são provavelmente melhores, pois a primeira opção de escolha DEC64 parece razoável aqui. É uma representação em ponto flutuante decimal, portanto, será menos surpreendente que o IEEE-754 (que é ponto flutuante binário) na maioria das situações, pois as pessoas tendem a pensar em decimal, por exemplo, pode representar exatamente 0,3. Ainda haverá problemas de representação em algumas circunstâncias, por exemplo, adicionando números muito grandes e muito pequenos.

para uma leitura mais aprofundada, eu sugeriria a série de artigos de Richard Harris, 'por que X não o corrige?'

jk.
fonte
Os links para os artigos da Harris podem ser encontrados nesta resposta a uma pergunta relacionada softwareengineering.stackexchange.com/a/101197/10563
jk.
2

Para uma linguagem geral, os números devem se comportar como os ensinados na aula de matemática. Somente linguagens para fins especiais, como as dos drivers de dispositivo, devem ter matemática especial.

Eu recomendaria o uso de números de precisão arbitrária em vez de números de precisão fixa. Sim, eles são mais lentos, mas se comportam como as pessoas esperam que o número se comporte. A colocação de limites artificiais sobre eles será relatada como um bug.

shawnhcorey
fonte
5
Infelizmente, números como os da aula de matemática não podem ser representados na memória finita, razão pela qual temos tantas representações numéricas diferentes em primeiro lugar.
Jörg W Mittag
4
E relatar "falta de memória" quando alguém tentar calcular o SQRT (2.0) provavelmente também será considerado um bug.
Simon B
3
Portanto, seu tipo de número único é, na realidade, uma infinidade de tipos de números, dependendo de alguns parâmetros.
Deduplicator
2
@ shawnhcorey: Então, você deseja especificar manualmente a precisão de cada operação?
Deduplicator
2
@shawnhcorey O estado global é mau. E agora isso interfere com toda aritmética? Além disso, como duas variáveis ​​com parâmetros diferentes interagem?
Deduplicator