Representa un número real sin pérdida de precisión.

10

El punto flotante actual (flotante ANSI C, doble) permite representar una aproximación de un número real.
¿Hay alguna forma de representar números reales sin errores ?
Aquí hay una idea que tuve, que es todo menos perfecta.

Por ejemplo, 1/3 es 0.33333333 ... (base 10) u o.01010101 ... (base 2), pero también 0.1 (base 3)
¿Es una buena idea implementar esta "estructura":

base, mantissa, exponent

entonces 1/3 podría ser 3 ^ -1

{[11] = base 3, [1.0] mantissa, [-1] exponent}

¿Alguna otra idea?

incud
fuente
12
Solo podrás representar números racionales de esta manera.
Andrej Bauer
¿Cómo propone implementar operaciones aritméticas en números en esta representación? ¿Usando logaritmos para cambiar de base? Esto sería mucho más costoso que las matemáticas de punto flotante IEEE.
David Zhang
Bueno, no tengo idea. No soy ingeniero :) Obviamente, no puedo implementarlo en hardware. Se puede hacer una implementación lenta e ineficiente en C. Esto sería solo un experimento
incudir el

Respuestas:

20

Todo depende de lo que quieras hacer.

Por ejemplo, lo que muestra es una excelente manera de representar números racionales. Sin embargo, todavía no puede representar algo así como o correo a la perfección.πmi

De hecho, muchos lenguajes como Haskell y Esquema han construido en el soporte para los números racionales, almacenándolos en la forma dondea,bson enteros.asia,si

La razón principal por la que estos no son ampliamente utilizados es el rendimiento. Los números de coma flotante son un poco imprecisos, pero sus operaciones se implementan en hardware. Su sistema propuesto permite una mayor precisión, pero requiere varios pasos para implementar, en lugar de una sola operación que se puede realizar en hardware.

Se sabe que algunos números reales son incomputable, tales como los números de acampada . No hay ningún algoritmo de enumeración de sus dígitos, a diferencia de , donde podemos calcular el n º dígitos, siempre y cuando esperamos lo suficiente.πnorte

Si desea una precisión real para cosas irracionales o números trascendentales, es probable que necesite usar algún tipo de sistema de álgebra simbólica, luego obtenga una respuesta final en forma simbólica, que podría aproximar a cualquier número de dígitos. Sin embargo, debido a los problemas de indecidibilidad descritos anteriormente, este enfoque es necesariamente limitado. Todavía es bueno para cosas como integrales aproximadas o series infinitas.

jmite
fuente
¿Puedo hacer otra pregunta? Si hubiera sido ingeniero de Intel en los años 80, ¿cómo habría "diseñado" su formato de número real?
incud
3
No estoy muy calificado para responder eso, como no soy ingeniero, soy investigador teórico. No veo mucho de malo con IEEE float y double standard, y ahora quad. No creo que haya habido muchas aplicaciones dependiendo de la aritmética de mayor precisión, y las que sí pueden usar una versión compatible con software.
jmite
El álgebra simbólica no es el formalismo correcto para la aritmética real exacta. Necesita una representación que permita mantisas arbitrariamente grandes.
Andrej Bauer
8
@AndrejBauer: una mantisa arbitrariamente grande no te va a salvar si quieres una representación exacta de . 2
user2357112 es compatible con Monica el
@jmite eres demasiado modesto :)
incud
22

No hay forma de representar todos los números reales sin errores si cada número debe tener una representación finita. Hay innumerables números reales, pero solo innumerables cadenas finitas de 1 y 0 que podría usar para representarlos.

David Richerby
fuente
Se podría restringir el requisito de representar cada número real a restringir solo esos números reales, que podrían ser la salida de una máquina de turing. Eso solo sería un número contable de números reales, pero aún cubriría cada número que alguna vez quisiera representar. Pero no creo que puedas hacer cálculos eficientes con tales números.
kasperd
3
@kasperd Se llaman reales computables . Desafortunadamente, cosas como la igualdad no son computables sobre los reales computables.
David Richerby
De hecho, es bastante claro que calcular la igualdad en esos números es equivalente a resolver el problema de detención. Dado un TM, uno puede definir un número real, que comienza con muchos decimales que son cero, exactamente tantos como el tiempo de ejecución del TM, y luego seguido por uno. Comparar ese número con cero es equivalente a resolver el problema de detención de la TM original.
kasperd
Esta respuesta es falsa. Alan Turing en su primer artículo sobre máquinas, en el que inventa las máquinas de Turing, habla de representar los reales como cadenas de datos infinitas . Esto lleva a la idea de la llamada "máquina de Turing de Tipo II", y existe una teoría muy exitosa del cálculo de números reales basada en la idea. También se implementa en la práctica, vea mi respuesta.
Andrej Bauer
1
Quizás lo haga técnicamente, pero pierde el punto, que es que hay representaciones infinitas perfectamente razonables de números reales. Y eso no es nada extraño: una conexión TCP / IP, o una llamada de Skype, o una transmisión de video desde una cámara son ejemplos de una cantidad (potencialmente) infinita de datos. No existe una limitación a priori sobre la cantidad de información que pueden proporcionar. Solo hay una limitación sobre la cantidad de información que puede obtener de ella en un tiempo limitado.
Andrej Bauer
7

Su idea no funciona porque un número representado en la base con mantisa my exponente e es el número racional b m - e , por lo tanto, su representación funciona precisamente para números racionales y no para otros. No puedes representar simetromisimetro-mi por ejemplo.2

Hay toda una rama de las matemáticas computables que se ocupa de la aritmética real exacta. Se han propuesto muchas estructuras de datos para representar números reales exactos : flujos de dígitos, flujos de contracciones afines, secuencias de Cauchy de racionales, secuencias de Cauchy de racionales diádicos, cortes de Dedekind, secuencias de intervalos shkrinking, etc. Existen implementaciones de bases aritméticas reales exactas. sobre estas ideas, por ejemplo:

De estos, iRRAM es el más maduro y eficiente. Marshall en un proyecto experimental, mientras que el tercero es un proyecto estudiantil, pero también el más accesible. Tiene una introducción muy agradable que explica los problemas relacionados con el cálculo de números reales, le recomiendo que lo mire.

Déjame hacer un comentario. Alguien objetará que un objeto infinito no puede ser representado por una computadora. En cierto sentido, esto es cierto, pero en otro no lo es. Nunca tenemos que representar un número real completo , solo necesitamos una aproximación finitaen cada etapa de la computación. Por lo tanto, solo necesitamos una representación que pueda representar una precisión real hasta cualquier precisión dada. Por supuesto, una vez que se nos acaba la memoria de la computadora, se nos acaba la memoria de la computadora, pero eso es una limitación de la computadora, no la representación en sí. Esta situación no es diferente a muchas otras en programación. Por ejemplo, las personas usan números enteros en Python y piensan en ellos como "arbitrariamente grandes" aunque, por supuesto, no pueden exceder el tamaño de la memoria disponible. A veces, el infinito es una aproximación útil para un número finito muy grande.

Además, a menudo escucho la afirmación de que las computadoras solo pueden manejar números reales computables . Esto pierde dos puntos importantes. Primero, las computadoras tienen acceso a los datos del mundo externo, por lo que también tendríamos que suponer (no verificable) que el mundo externo también es computable. En segundo lugar, necesitamos distinguir entre los reales que una computadora puede calcular y los reales que puede representar. Por ejemplo, si elegimos flujos de dígitos como representación de reales, entonces es perfectamente posible representar un real no computable: si alguien nos lo diera, sabríamos cómo representarlo. Pero si elegimos representar reales como piezas de código fuente que computan dígitos, entonces no podríamos representar reales no computables, obviamente.

En cualquier caso, este tema se aborda mejor con algunas lecturas adicionales.

Andrej Bauer
fuente
+1 pero objetaría que no puede representar una cadena infinita por una aproximación finita sin perder precisión , como lo requiere la pregunta. Claro, puede obtener tanta precisión como desee, como podría aproximarse por un racional, pero eso no es exactamente lo que la pregunta está pidiendo. Podría decirse que es un problema con la pregunta, en lugar de la respuesta.
David Richerby
2
El punto es que estamos no representamos con cadenas finitas. Estamos representando con cadenas infinitas , pero solo necesitamos una porción finita de una cadena tan infinita en cada etapa de cálculo. O para decirlo de otra manera: no hay pérdida de precisiones, ya que la estructura de datos contiene toda la información, pero, por supuesto, no puede acceder o procesar toda la información a la vez: la estructura de datos le brinda tanta precisión como usted solicita. . El cuello de botella no está del lado de la estructura de datos, sino del lado del "consumidor" que quiere obtener la información.
Andrej Bauer
22=2k2 k222k1.99 ...
2
@Thomas: el cálculo simbólico no representa números reales, sino que suele ser un subcampo de los reales, generalmente el generado por funciones elementales y raíces de polinomios. Estos subcampos no están completos (cerrados bajo los límites de las secuencias de Cauchy) ni computacionalmente completos (cerrados bajo los límites computables de las secuencias de Cauchy). Una representación no es una representación de reales a menos que pueda representar todos los reales (computables): y los cálculos simbólicos fallan en esta condición.
Andrej Bauer
1
Estas observaciones sobre la contabilidad son irrelevantes porque los reales computables no son contables computablemente.
Andrej Bauer
7

Hay muchas implementaciones efectivas de números racionales , pero una que se ha propuesto muchas veces y que incluso puede manejar algunos irracionales bastante bien es las fracciones continuas .

Cita de las fracciones continuas de Darren C. Collins :

Teorema 5-1. - La expresión de fracción continua de un número real es finita si y solo si el número real es racional.

Cita de Mathworld - Fracciones continuas periódicas

... una fracción continua es periódica si es una raíz de un polinomio cuadrático.

es decir, todas las raíces se pueden expresar como fracciones continuas periódicas.

También hay una fracción continua exacta para π que me sorprendió hasta que @AndrejBauer señaló que en realidad no lo es.

OldCurmudgeon
fuente
ππ
La representación de fracciones continuas de reales fue propuesta como una implementación para la aritmética real exacta hace un tiempo por J. Vuillemin. Resulta que no es muy eficiente ya que los números se vuelven bastante grandes muy pronto, y es difícil reducir su tamaño.
Andrej Bauer
Las fracciones continuas tienen algunos problemas computacionales incluso para representar números racionales, mientras que se pueden comparar relativamente rápido usando una variante de orden lexicográfico, y aunque manipular una sola fracción continua es fácil, tanto la suma (binaria) como la multiplicación en CF son operaciones bastante complicadas para implementar.
Steven Stadnicki
5

Hay una serie de sugerencias "reales reales" en los comentarios (por ejemplo, fracciones continuas, transformaciones fraccionales lineales, etc.). El problema típico es que, si bien puedes calcular las respuestas a una fórmula, la igualdad a menudo es indecidible.

Sin embargo, si solo está interesado en los números algebraicos, entonces tiene suerte: la teoría de los campos cerrados reales es completa, mínima y decidible. Esto fue probado por Tarski en 1948.

Pero hay una trampa. No desea utilizar el algoritmo de Tarski, ya que se encuentra en la clase de complejidad NONELEMENTARY, que es tan poco práctico como los algoritmos poco prácticos pueden ser. Hay métodos más recientes que reducen la complejidad a DEXP, que es lo mejor que conocemos actualmente.

Tenga en cuenta que el problema es NP-hard porque incluye SAT. Sin embargo, no se sabe (ni se cree) que esté en NP.

EDITAR Voy a tratar de explicar esto un poco más.

El marco para comprender todo esto es un problema de decisión conocido como Teorías del módulo de satisfacción, o SMT para abreviar. Básicamente, queremos resolver SAT para una teoría construida sobre la lógica clásica.

Entonces comenzamos con la lógica clásica de primer orden con una prueba de igualdad. Qué símbolos de función queremos incluir y cuáles son sus axiomas determinan si la teoría es o no decidible.

Hay muchas teorías interesantes expresadas en el marco SMT. Por ejemplo, existen teorías de estructuras de datos (por ejemplo, listas, árboles binarios, etc.) que se utilizan para ayudar a probar que los programas son correctos, y la teoría de la geometría euclidiana. Pero para nuestro propósito, estamos viendo teorías de diferentes tipos de números.

La aritmética previa a la hamburguesa es la teoría de los números naturales con suma. Esta teoría es decidible.

La aritmética de peano es la teoría de los números naturales con suma y multiplicación. Esta teoría no es decidible, como lo demostró Gödel.

La aritmética de Tarski es la teoría de los números reales con todas las operaciones de campo (suma, resta, multiplicación y división). Curiosamente, esta teoría es decidible. Este fue un resultado altamente contra-intuitivo en ese momento. Puede suponer que porque es un "superconjunto" de los números naturales es "más difícil", pero este no es el caso; compare la programación lineal sobre los racionales con la programación lineal sobre los enteros, por ejemplo.

Puede que no parezca obvio que la satisfacción es todo lo que necesita, pero lo es. Por ejemplo, si desea probar si la raíz cuadrada positiva de 2 es igual o no a la raíz cúbica real de 3, puede expresar esto como el problema de la satisfacción:

X.X>0 0X2-2=0 0X3-3=0 0

miX

pecado{XπEl |pecadoX=0 0}pecado

miXmiyoX


Alfred Tarski (1948), Un método de decisión para álgebra y geometría elementales .

Seudónimo
fuente
2

Es posible representar una clase muy grande de números llamados números algebraicos exactamente, tratándolos como raíces de polinomios.

πmi

Más hachas
fuente
mimiyoXpecadocos{XREl |pecadoX=0 0}
@ Seudónimo Esto parece realmente interesante, pero no creo que tenga los conocimientos matemáticos para entenderlo correctamente ... ¿Qué quiere decir con "lo suficientemente cerca de los enteros"?
Más ejes
Voy a enmendar mi respuesta para explicar.
Seudónimo
1

π2

lPlanta
fuente
Esta respuesta es falsa. Hay toda un área de aritmética real exacta que explica cómo representar reales por computadora. La suposición de que un real debe estar representado por una cadena finita es errónea. También podemos usar cadenas infinitas. ¡Alan Turing ya escribió sobre esto en su primer artículo, en el que inventó las máquinas de Turing!
Andrej Bauer
¿Puede vincular a un documento sobre cómo almacenar y manipular cadenas de infinate en una computadora real, porque esa sería la respuesta a lo que la pregunta preguntaba? Tampoco fue su primer artículo, su primera publicación fue 1936, ese documento fue 1937.
lPlant
Tienes razón, es el periódico de 1937. Para ver cómo se manipulan las cadenas infinitas, puede mirar el protocolo TCP / IP, por ejemplo. Nunca dije que todo el real debía ser almacenado en la computadora.
Andrej Bauer
-1

No puede representar todos los números reales en una computadora, pero puede representar muchos. Podrías usar fracciones que representarían más números que flotantes. También podría hacer cosas más sofisticadas como representar números como raíz de algún polinomio con una aproximación que según el método de newtons convergerá al número.

Alice Ryhl
fuente
De nuevo, esta es una respuesta falsa, producida por ignorancia. Existe un área completa de aritmética real exacta que estudia cómo representar todos los reales mediante estructuras de datos adecuadas.
Andrej Bauer
@AndrejBauer ¿Entonces sugiere que hay una estructura de datos que puede representar cualquier número real? Cualquier estructura de datos de este tipo tendría que usar una cantidad infinita incontable de bits para representar cualquier número.
Alice Ryhl
1
Una cantidad contable de bits es suficiente, en primer lugar, y dado que no los necesita todos a la vez, ni puede procesarlos a la vez, pueden almacenarse en el tiempo y en el espacio.
Andrej Bauer
@AndrejBauer Esta respuesta es correcta y dice lo mismo que la tuya, aunque con mucha menos información. No puede representar todos los números reales en una computadora. Puede representar cualquier número real, pero no todos a la vez. En todo caso, diría que puede representar "muchos", ya que solo puede representar finitamente muchos en una computadora determinada, y solo casi ninguno (en el sentido matemático) en una computadora abstracta que sea equivalente a los modelos de computación habituales (Turing máquina equivalente).
Gilles 'SO- deja de ser malvado'
-1

Es posible representar cualquier número con precisión donde las entradas son representables almacenándolas como una cadena de operaciones, por ejemplo, almacenando 1/3como 1 divided by 3, al manejar la cancelación de operaciones puede simplificar la siguiente operación para dar una respuesta exacta (1/3) * 3. Esto también puede manejar situaciones en las que ha conocido irracionales, como πretenerlo en sus cálculos.

Sin embargo, requiere una cantidad creciente de memoria para cada número y, suponiendo que su simplificador no sea perfecto, probablemente requerirá una cantidad cada vez mayor para los valores en los que está trabajando mucho.

Jack Aidley
fuente
5 5+26 6-2=3
En efecto. De hecho, probablemente sea efectivamente imposible automatizar completamente con éxito. Sin embargo, el resultado sigue siendo preciso incluso si no ha utilizado la representación más simple posible.
Jack Aidley