math - Un petit détournement vers la précision (im) à virgule flottante, partie 1

Translate

La plupart des mathématiciens conviennent que:

eπi+ 1 = 0

Cependant, la plupart des implémentations en virgule flottante ne sont pas d'accord. Dans quelle mesure pouvons-nous régler ce différend?

Je suis impatient d'entendre parler de différents langages et implémentations, ainsi que de diverses méthodes pour rendre le résultat aussi proche que possible de zéro. Sois créatif!

This question and all comments follow the "Attribution Required."

Toutes les réponses

Translate

Ce n'est pas que la plupart des implémentations en virgule flottante ne sont pas d'accord, c'est juste qu'elles ne peuvent pas obtenir la précision nécessaire pour obtenir une réponse à 100%. Et la bonne réponse est qu'ils ne le peuvent pas.

PI est une série infinie de chiffres que personne n'a été capable de désigner autrement que par une représentation symbolique, et e ^ X est le même, et donc le seul moyen d'obtenir une précision de 100% est d'aller symbolique.

La source
Translate

Voici une courte liste d'implémentations et de langages que j'ai essayés. Il est trié par proximité de zéro:

  • Schème:(+ 1 (make-polar 1 (atan 0 -1)))
    • 0.0+1.2246063538223773e-16i(Chez Scheme, MIT Scheme)
    • 0.0+1.22460635382238e-16i(Ruse)
    • 0.0+1.22464679914735e-16i(Poulet avecnumbersOeuf)
    • 0.0+1.2246467991473532e-16i(MzScheme, SISC, Gauche, Gambit)
    • 0.0+1.2246467991473533e-16i(SCM)
  • Common Lisp:(1+ (exp (complex 0 pi)))
    • #C(0.0L0 -5.0165576136843360246L-20)(CLISP)
    • #C(0.0d0 1.2246063538223773d-16)(CMUCL)
    • #C(0.0d0 1.2246467991473532d-16)(SBCL)
  • Perl:use Math::Complex; Math::Complex->emake(1, pi) + 1
    • 1.22464679914735e-16i
  • Python:from cmath import exp, pi; exp(complex(0, pi)) + 1
    • 1.2246467991473532e-16j(CPython)
  • Rubis:require 'complex'; Complex::polar(1, Math::PI) + 1
    • Complex(0.0, 1.22464679914735e-16)(IRM)
    • Complex(0.0, 1.2246467991473532e-16)(JRuby)
  • R:complex(argument = pi) + 1
    • 0+1.224606353822377e-16i
La source
Translate

Est-il possible de régler ce différend?

Ma première pensée est de me tourner vers un langage symbolique, commeÉrable. Je ne pense pas que cela compte comme une virgule flottante.

En fait, comment représente-t-oni(oujpour les ingénieurs) dans un langage de programmation conventionnel?

Un meilleur exemple est peut-être sin (π) = 0? (Ou ai-je encore manqué le point?)

La source
Translate

Je suis d'accord avec Ryan, il faudrait passer à un autre système de représentation des nombres. La solution est en dehors du domaine des mathématiques en virgule flottante car vous avez besoin que pi soit représenté sous la forme d'une décimale infiniment longue, de sorte que tout schéma de précision limitée ne fonctionnera tout simplement pas (du moins pas sans utiliser une sorte de facteur de fudge pour compenser la perte précision).

La source
Translate

Votre question me semble un peu étrange, car vous semblez suggérer que le calcul en virgule flottante est implémenté par le langage. Ce n'est généralement pas vrai, car le calcul FP est effectué à l'aide d'un processeur à virgule flottante dans le matériel. Mais logiciel ou matériel, la virgule flottante sera toujours inexacte. C'est ainsi que fonctionnent les flotteurs.

Si vous avez besoin d'une meilleure précision, vous devez utiliser une représentation numérique différente. Tout comme si vous faites des calculs entiers sur des nombres qui ne rentrent pas dans un entier ou un long. Certaines langues ont des bibliothèques pour cela intégrées (je sais que java a BigInteger et BigDecimal), mais vous devrez explicitement utiliser ces bibliothèques au lieu de types natifs, et les performances seraient (parfois considérablement) pires que si vous utilisiez des flottants.

La source
Translate

@Ryan Fox

In fact, how does one represent i (or j for the engineers) in a conventional programming language?

Les types de données complexes natifs sont loin d'être inconnus. Fortran l'avait au milieu des années soixante, et l'OP présente une variété d'autres langues qui les soutiennent dans le suivi de l'histoire.

Et les nombres complexes peuvent être ajoutés à d'autres langages en tant que bibliothèques (avec une surcharge d'opérateurs, ils ressemblent même à des types natifs dans le code).

Mais à moins que vous ne fournissiez un cas particulier pour ce problème, le "non-accord" n'est qu'une expression d'arithmétique machine imprécise, non? C'est comme se plaindre de ça

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

se termine par (t! = 0) (Du moins si vous utilisez un compilateur assez stupide) ...

La source
Translate

J'ai eu looooong café causerie avec mon meilleur ami parlant des nombres irrationnels et de la différence entre les autres nombres. Eh bien, nous sommes tous les deux d'accord sur ce point de vue différent:

Les nombres irrationnels sont des relations, en tant que fonctions, d'une certaine manière, de quelle manière? Eh bien, pensez à "si vous voulez un cercle parfait, donnez-moi un pi parfait", mais les cercles sont différents des autres chiffres (4 côtés, 5, 6 ... 100, 200) mais ... vous avez, plus comme un cercle il ressemble. Si vous m'avez suivi jusqu'à présent, reliant toutes ces idées voici la formule pi:enter image description here

Donc, pi est une fonction, mais qui ne finit jamais! à cause du paramètre ∞, mais j'aime à penser que vous pouvez avoir une "instance" de pi, si vous modifiez le paramètre ∞ pour un très grand Int, vous aurez une très grande instance de pi.

Idem avec e, donnez-moi un paramètre énorme, je vais vous donner un énorme e.

Rassembler toutes les idées:

Comme nous avons des limitations de mémoire, le langage et les bibliothèques nous fournissent une énorme instance de nombres irrationnels, dans ce cas, pi et e, comme résultat final, vous aurez une longue approche pour obtenir 0, comme les exemples fournis par @Chris Jester-Young

La source
Translate

En fait, comment représenter i (ou j pour les ingénieurs) dans un langage de programmation conventionnel?

Dans un langage qui n'a pas de représentation native, il est généralement ajouté à l'aide de la POO pour créer unComplexclasse à représenterietj, avec surcharge de l'opérateur pour traiter correctement les opérations impliquant d'autresComplexnombres et / ou autres primitives numériques natives de la langue.

Par exemple:Complex.java, C ++ <complexe>

La source
Translate

L'analyse numérique nous apprend que vous ne pouvez pas vous fier à la valeur précise des petites différences entre les grands nombres.

Cela n'affecte pas seulement l'équation en question ici, mais peut apporter de l'instabilité à tout, de la résolution d'un ensemble quasi singulier d'équations simultanées, en passant par la recherche des zéros des polynômes, à l'évaluation de log (~ 1) ou exp (~ 0) ( J'ai même vu des fonctions spéciales pour évaluer log (x + 1) et (exp (x) -1) pour contourner cela).

Je vous encourage à ne pas penser en termes de réduction de la différence - vous ne pouvez pas - mais plutôt à faire les calculs associés de manière à garantir l'erreur minimale.

Je suis désolé, cela fait 43 ans que j'ai eu ce tambour en moi à l'université, et même si je pouvais me souvenir des références, je suis sûr qu'il y a de meilleures choses maintenant. je suggèrececomme point de départ.


Si cela semble un peu condescendant, je m'en excuse. Mon "Analyse numérique 101" faisait partie de mon cours de chimie, car il n'y avait pas beaucoup de CS à cette époque. Je n'ai pas vraiment une idée de la place / de l'importance de l'analyse numérique dans un cours de CS moderne.

La source
Translate

C'est une limitation de nos architectures de calcul en virgule flottante actuelles. L'arithmétique en virgule flottante n'est qu'une approximation des pôles numériques comme e ou pi (ou tout autre élément au-delà de la précision autorisée par vos bits). J'apprécie vraiment ces nombres car ils défient la classification et semblent avoir une plus grande entropie (?) Que même les nombres premiers, qui sont une série canonique. Un ratio défie la représentation numérique, parfois des choses simples comme ça peuvent souffler l'esprit d'une personne (j'adore ça).

Heureusement, des langages et des bibliothèques entiers peuvent être dédiés aux fonctions trigonométriques de précision en utilisant des concepts de notation (similaires à ceux décrits parLasse V. Karlsen).

Considérez une bibliothèque / un langage qui décrit des concepts comme e et pi sous une forme qu'une machine peut comprendre. Une machine a-t-elle une idée de ce qu'est un cercle parfait? Probablement pas, mais nous pouvons créer un objet - cercle qui satisfait toutes les caractéristiques connues que nous lui attribuons (rayon constant, la relation du rayon à la circonférence est de 2 * pi * r = C). Un objet comme pi n'est décrit que par le rapport mentionné ci-dessus. r & C peuvent être des objets numériques décrits par la précision que vous souhaitez leur donner. e peut être défini "comme e est le nombre réel unique tel que la valeur de la dérivée (pente de la tangente) de la fonction f (x) = ex au point x = 0 est exactement 1" deWikipédia.

Question amusante.

La source