Pregunta

La mayoría de los matemáticos coinciden en que:

miπi + 1 = 0

Sin embargo, la mayoría de las implementaciones de punto flotante no están de acuerdo.¿Qué tan bien podemos resolver esta disputa?

Tengo muchas ganas de conocer diferentes lenguajes e implementaciones, y varios métodos para hacer que el resultado sea lo más cercano a cero posible.¡Ser creativo!

¿Fue útil?

Solución

No es que la mayoría de las implementaciones de punto flotante no estén de acuerdo, es sólo que no pueden obtener la precisión necesaria para obtener una respuesta del 100%.Y la respuesta correcta es que no pueden.

PI es una serie infinita de dígitos que nadie ha podido denotar mediante otra cosa que no sea una representación simbólica, y e^X es lo mismo y, por lo tanto, la única forma de llegar al 100% de precisión es volverse simbólico.

Otros consejos

Aquí hay una breve lista de implementaciones y lenguajes que he probado.Está ordenado por cercanía a cero:

  • Esquema: (+ 1 (make-polar 1 (atan 0 -1)))
    • 0.0+1.2246063538223773e-16i (Esquema Chez, Esquema MIT)
    • 0.0+1.22460635382238e-16i (Engaño)
    • 0.0+1.22464679914735e-16i (pollo con numbers huevo)
    • 0.0+1.2246467991473532e-16i (MzScheme, SISC, Gauche, Gambito)
    • 0.0+1.2246467991473533e-16i (SCM)
  • Ceceo común: (1+ (exp (complex 0 pi)))
    • #C(0.0L0 -5.0165576136843360246L-20) (CLIP)
    • #C(0.0d0 1.2246063538223773d-16) (CMUCL)
    • #C(0.0d0 1.2246467991473532d-16) (SBCL)
  • Perla: use Math::Complex; Math::Complex->emake(1, pi) + 1
    • 1.22464679914735e-16i
  • Pitón: from cmath import exp, pi; exp(complex(0, pi)) + 1
    • 1.2246467991473532e-16j (CPython)
  • Rubí: require 'complex'; Complex::polar(1, Math::PI) + 1
    • Complex(0.0, 1.22464679914735e-16) (MRI)
    • Complex(0.0, 1.2246467991473532e-16) (JRubí)
  • R: complex(argument = pi) + 1
    • 0+1.224606353822377e-16i

¿Es posible resolver esta disputa?

Mi primer pensamiento es buscar un lenguaje simbólico, como Arce.Sin embargo, no creo que eso cuente como punto flotante.

De hecho, ¿cómo se representa i (o j para los ingenieros) en un lenguaje de programación convencional?

¿Quizás un mejor ejemplo sea sin(π) = 0?(¿O me he perdido de nuevo el punto?)

Estoy de acuerdo con Ryan, necesitarías pasar a otro sistema de representación numérica.La solución está fuera del ámbito de las matemáticas de coma flotante porque necesita representar pi como un decimal infinitamente largo, por lo que cualquier esquema de precisión limitada simplemente no funcionará (al menos no sin emplear algún tipo de factor de manipulación para compensar la pérdida). precisión).

Su pregunta me parece un poco extraña, ya que parece estar sugiriendo que el lenguaje implementa las matemáticas de punto flotante.Por lo general, eso no es cierto, ya que las matemáticas de FP se realizan utilizando un procesador de punto flotante en el hardware.Pero en software o hardware, el punto flotante siempre será inexacto.Así es como funcionan los flotadores.

Si necesita una mayor precisión, debe utilizar una representación numérica diferente.Al igual que si estuvieras haciendo matemáticas enteras con números que no caben en un int o long.Algunos lenguajes tienen bibliotecas integradas para eso (sé que Java tiene BigInteger y BigDecimal), pero tendrías que usar explícitamente esas bibliotecas en lugar de tipos nativos, y el rendimiento sería (a veces significativamente) peor que si usaras flotantes.

@Ryan Fox

De hecho, ¿cómo se representa i (o j para los ingenieros) en un lenguaje de programación convencional?

Los tipos de datos complejos nativos están lejos de ser desconocidos.Fortran lo tenía a mediados de los años sesenta, y el OP exhibe una variedad de otros lenguajes que los respaldan en su seguimiento.

Y los números complejos se pueden agregar a otros lenguajes como bibliotecas (con la sobrecarga de operadores, incluso parecen tipos nativos en el código).

Pero a menos que proporcione un caso especial para este problema, el "no acuerdo" es sólo una expresión de aritmética de máquina imprecisa, ¿no?Es como quejarse de que

float r = 2/3;
float s = 3*r;
float t = s - 2;

termina con (t != 0) (Al menos si usas un compilador lo suficientemente tonto)...

Tuve muuuchas charlas de café con mi mejor amigo hablando sobre números irracionales y la diferencia entre otros números.Bueno, ambos coincidimos en este punto de vista diferente:

Los números irracionales son relaciones, como funciones, en cierto modo, ¿de qué manera?Bueno, piensa en "si quieres un círculo perfecto, dame un pi perfecto", pero los círculos son diferentes a las otras figuras (4 lados, 5, 6...100, 200) pero...¿Cuántos lados más tienes? Se parece más a un círculo.Si me seguiste hasta ahora, conectando todas estas ideas aquí está la fórmula pi:enter image description here

Entonces, pi es una función, ¡pero nunca termina!debido al parámetro ∞, pero me gusta pensar que puedes tener una "instancia" de pi, si cambias el parámetro ∞ por un Int muy grande, tendrás una instancia de pi muy grande.

Lo mismo con e, dame un parámetro enorme, te daré una e enorme.

Juntando todas las ideas:

Como tenemos limitaciones de memoria, el lenguaje y las bibliotecas nos brindan una gran instancia de números irracionales, en este caso, pi y e, como resultado final, tendrá un largo camino para obtener 0, como los ejemplos proporcionados por @Chris Jester-Young.

De hecho, ¿cómo se representa i (o j para los ingenieros) en un lenguaje de programación convencional?

En un lenguaje que no tiene una representación nativa, generalmente se agrega usando programación orientada a objetos para crear un Complex clase para representar i y j, con el operador sobrecargado para abordar adecuadamente las operaciones que involucran otros Complex números u otras primitivas numéricas nativas del idioma.

P.ej: Complejo.java, C++ <complejo>

El análisis numérico nos enseña que no se puede confiar en el valor preciso de pequeñas diferencias entre números grandes.

Esto no solo afecta la ecuación en cuestión aquí, sino que puede traer inestabilidad a todo, desde resolver un conjunto casi singular de ecuaciones simultáneas, pasando por encontrar los ceros de polinomios, hasta evaluar log(~1) o exp(~0) ( Incluso he visto funciones especiales para evaluar log(x+1) y (exp(x)-1) para solucionar este problema).

Les animo a que no piensen en términos de reducir a cero la diferencia (no se puede), sino más bien en hacer los cálculos asociados de tal manera que se asegure el error mínimo.

Lo siento, han pasado 43 años desde que me inculcaron esto en la universidad, e incluso si pudiera recordar las referencias, estoy seguro de que ahora hay cosas mejores.yo sugiero este como punto de partida.


Si eso suena un poco condescendiente, me disculpo.Mi "Análisis numérico 101" era parte de mi curso de Química, ya que en aquellos días no había mucha informática.Realmente no tengo una idea del lugar/importancia que tiene el análisis numérico en un curso de informática moderno.

Es una limitación de nuestras arquitecturas computacionales de punto flotante actuales.La aritmética de punto flotante es sólo una aproximación de polos numéricos como e o pi (o cualquier cosa más allá de la precisión que permiten sus bits).Realmente disfruto estos números porque desafían la clasificación y parecen tener mayor entropía (?) que incluso los números primos, que son una serie canónica.La representación numérica de una proporción desafía, a veces cosas simples como esa pueden dejar boquiabierto a una persona (me encanta).

Afortunadamente, se pueden dedicar lenguajes y bibliotecas enteras a funciones trigonométricas de precisión mediante el uso de conceptos de notación (similares a los descritos por Lasse V.karlsen ).

Considere una biblioteca/lenguaje que describa conceptos como e y pi en una forma que una máquina pueda entender.¿Tiene una máquina alguna noción de lo que es un círculo perfecto?Probablemente no, pero podemos crear un objeto: un círculo que satisfaga todas las características conocidas que le atribuimos (radio constante, la relación entre el radio y la circunferencia es 2*pi*r = C).Un objeto como pi sólo se describe mediante la relación antes mencionada.r & C pueden ser objetos numéricos descritos con la precisión que desee darles.e se puede definir "ya que e es el único número real tal que el valor de la derivada (pendiente de la recta tangente) de la función f(x) = ex en el punto x = 0 es exactamente 1" de Wikipedia.

Pregunta divertida.

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