Solo un tipo de número en diseño de lenguaje


8

Actualmente estoy aprendiendo sobre la construcción del compilador y el diseño del lenguaje y estoy pensando en qué tipos de datos nativos quiero admitir en mi idioma. Ahora hay muchos idiomas que hacen una distinción entre números enteros y números reales. Sin embargo, recuerdo haber visto una charla de Douglas Crockford en la que dijo:

Tener un solo tipo de número en el sistema significa que no puede cometer un error al elegir el tipo de número incorrecto

También mencionó que recomienda una representación numérica diferente a la IEEE-754 comúnmente utilizada (por favor corríjame si me equivoco), nombrando DEC64. De ahí mi pregunta: para un lenguaje de propósito general que tiene un enfoque principalmente educativo, ¿qué representación numérica debo usar?

EDITAR: Con un enfoque educativo, estoy hablando de mi propio progreso en el aprendizaje de compiladores, no para educar a otros.


44
No hay una respuesta correcta aquí. Para fines educativos, recomendaría usar decimales de precisión arbitrarios (por ejemplo, Javas BigDecimal y BigInteger). Tiene toda la flexibilidad que se puede pedir, evita tener que explicar los errores de redondeo desde el principio y se comporta de manera muy parecida a la calculadora a la que están acostumbrados los alumnos.
marzo

55
La pregunta comienza preguntando sobre los tipos de números y luego vira a representaciones de números . Lo cual es un poco confuso, posiblemente también confundido. Además, es probable que incluso las respuestas basadas en opiniones estén fuera de lugar si no puede aclarar el enfoque educativo que menciona: ¿será un lenguaje para las personas que están aprendiendo a programar (como Pascal), un proyecto para su propio ser? educación, un lenguaje para ser utilizado por los pequeños aprendiendo a contar, ...?
Marca de alto rendimiento

1
Gracias, edité la pregunta. Menciono tanto los TIPOS de número como las REPRESENTACIONES porque pensé que tal vez alguien podría señalarme la dirección correcta para mis dos problemas :)
Niklas Vest

Solo recuerde, poder eliminar una clase de errores no significa necesariamente que su número neto de errores disminuya.
cuál es

1
"que tiene un enfoque principalmente educativo" Al igual que la informática educativa? Debido a que un problema con el que se encontrará desde el punto de vista del diseño del lenguaje es admitir operadores binarios como los cambios aritméticos y lógicos. (Esto también juega con las reglas de gramática de precedencia de operadores si incluye operadores binarios para aprender cómo los idiomas manejan las cosas). Si no te importan, entonces podrías usar un solo tipo de datos. (JS tiene un solo tipo de "Número" si desea ver una forma extraña de manejar las cosas).
Sirisian

Respuestas:


11

Tenemos una representación numérica diferente en general porque tienen diferentes fortalezas y debilidades, ya sea velocidad, precisión o rango. Además, este tiene que ser el caso porque no podemos representar todos los números reales con memoria finita, siempre tenemos que elegir algunos que no podamos representar exactamente.

La cita de Doug Crockford que tiene es casi idiota, si solo puede elegir una representación, entonces no puede elegir la incorrecta, pero tampoco puede elegir la correcta. es decir, su única opción funcionará para algunos usos pero no para todos.

Es cierto que algunas representaciones son probablemente mejores ya que la primera opción para ir a DEC64 parece razonable aquí. Es una representación decimal en coma flotante, por lo que será menos sorprendente que IEEE-754 (que es un punto flotante binario) en la mayoría de las situaciones, ya que las personas tienden a pensar en decimal, por ejemplo, puede representar 0.3 exactamente. Todavía tendrá problemas de representación en algunas circunstancias, por ejemplo, agregar números realmente grandes y muy pequeños juntos

para leer más, sugeriría la serie de artículos de Richard Harris "por qué X no te arreglará el blues de punto flaging"


Se pueden encontrar enlaces a los artículos de Harris en esta respuesta a una pregunta relacionada softwareengineering.stackexchange.com/a/101197/10563
jk.

2

Para un lenguaje general, los números deben comportarse como los que se enseñan en la clase de matemáticas. Solo los lenguajes de propósito especial, como los de los controladores de dispositivos, deben tener matemáticas especiales.

Recomendaría usar números de precisión arbitraria en lugar de números de precisión fija. Sí, son más lentos, pero se comportan como la gente espera que los números se comporten. La colocación de límites artificiales en ellos se informará como un error.


55
Desafortunadamente, los números como los de la clase de matemáticas no se pueden representar en la memoria finita, que es la razón por la que tenemos tantas representaciones de números diferentes en primer lugar.
Jörg W Mittag

44
E informar "sin memoria" cuando alguien intenta calcular SQRT (2.0) probablemente también se considerará un error.
Simon B

3
Por lo tanto, su tipo de número único es en realidad una infinidad de tipos de números que dependen de algunos parámetros.
Deduplicador

2
@shawnhcorey: Entonces, ¿desea exigir que se especifique manualmente la precisión de cada operación?
Deduplicador

2
@shawnhcorey El estado global es malo. ¿Y ahora interfiere con toda la aritmética? Además, ¿cómo interactuarían dos variables con diferentes parámetros?
Deduplicador el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.