Pregunta

Entonces, conozco la precisión de punto flotante (y cómo cosas como 1.1 no se pueden expresar exactamente en binario) y todo eso, pero me pregunto: ¿cómo implementan las bibliotecas relacionadas con las matemáticas una precisión infinita? En otras palabras, ¿cómo representaría, por ejemplo, 1.1 con precisión en binario? Solo una breve descripción sería genial, puedo averiguar los detalles exactos yo mismo. Gracias. :)

¿Fue útil?

Solución

No hay bibliotecas de precisión infinita, pero hay bibliotecas de precisión arbitrarias. Para obtener detalles sobre cómo se implementan, lea algunos documentación :-)

Para representar 1.1 exactamente en binario, el punto flotante no se puede usar como se indica correctamente. Puede representarse si almacena la parte integral (1) como un entero, y la parte fraccional (.1) como otro entero, y luego necesita crear la lógica para tratar estas estructuras. Alternativamente, podría almacenarse como una fracción (11/10) con el denominador y el numerador almacenados como enteros.

Otros consejos

Si realmente quieres decir precisión infinita, hay dos opciones:

  • Usa alguna forma de cálculo perezoso. Luego, puede pedirle a un número la precisión que desee "después de" ejecutar el cálculo (ya que es perezoso, en realidad solo se hizo entonces). El inconveniente es que esto es muy ineficiente. Puede hacer esto en un idioma como Haskell usando un sistema numérico especial donde las representaciones se superponen, por ejemplo. base 2 con dígitos -1, 0, 1. La representación habitual no es adecuada, ya que, por ejemplo, 1 necesita precisión infinita para decidir entre generar 0 para 0.999 ... y 1 para 1.000 ...

  • Haz el cálculo simbólicamente. Representa enteros, racionales, raíces, etc. exactamente. Esto es necesario si desea decidir la igualdad, pero también es ineficiente y limitado a casos especiales.

Las bibliotecas

matemáticas con precisión infinita no están implementadas. No se puede hacer. El número 1/3 no puede representarse en un número finito de bits que no sea una fracción. Los números trascendentes como pi y e no se pueden representar completamente de ninguna manera.

Por otro lado, es posible crear bibliotecas matemáticas con una precisión enorme . Se trata de asignar suficientes bits para la mantisa del valor de coma flotante.

Hay ciertos algoritmos geométricos que dependen de la aritmética exacta, por lo que si busca en la biblioteca CGAL encontrará una variedad de tipos numéricos exactos que están "cerrados". bajo diversas operaciones. Es decir, no hay forma de usar las operaciones compatibles para producir un resultado que no se pueda representar exactamente.

Algunos ejemplos:

  • Los enteros se cierran bajo la suma y la multiplicación.

  • Los racionales también se cierran por división, a excepción de un caso especial para cero. Se puede representar como un par de enteros. Consulte también las funciones de números racionales en GMP . por ejemplo, 1.1 = 11/10, se puede representar como (11, 10).

  • Un tipo de número que también se cierra bajo la raíz cuadrada.

También podrías representar números en decimal y hacer aritmética decimal. La representación subyacente es binaria en el sentido de que cada dígito se representa con un código binario. Cada dígito, ya sea a la izquierda o a la derecha del punto decimal, se trata como un número entero. La aritmética se realiza `` manualmente '', dígito a dígito.

Un ejemplo de una biblioteca basada en decimal es BCMath en PHP.

Si bien Pax está totalmente aquí cuando hablamos de puntos flotantes y números, creo que hay una solución, pero es muy ineficiente.
Puede usar una cadena para representar su número, las cadenas no pierden precisión.
Siempre que tenga un número como "0.0001" + " 0.1 " itera ambas cadenas y convierte solo la posición actual a int.
Paso 1:
0 + 0 = 0 - > convertir a cadena y asignar a datos [0].
Paso 2:
0 + 1 = 1 - > convertir a cadena y asignar a datos [1].
Paso 3:
iter > " 0.1 " .lenght () - > detener.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top