Question

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 ?

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

Était-ce utile?

La solution

Ce n'est pas que la plupart des implémentations à virgule flottante ne soient pas d'accord, c'est simplement 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 pu désigner par autre chose qu'une représentation symbolique, et e^X est le même, et donc la seule façon d'atteindre une précision de 100 % est de passer au symbolique.

Autres conseils

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 (Schéma Chez, Schéma MIT)
    • 0.0+1.22460635382238e-16i (Ruse)
    • 0.0+1.22464679914735e-16i (Poulet avec numbers œuf)
    • 0.0+1.2246467991473532e-16i (MzScheme, SISC, Gauche, Gambit)
    • 0.0+1.2246467991473533e-16i (SCM)
  • Lisp commun : (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)
  • 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

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ésenter je (ou j pour les ingénieurs) dans un langage de programmation conventionnel ?

Peut-être qu'un meilleur exemple est sin(π) = 0 ?(Ou ai-je encore raté le point ?)

Je suis d'accord avec Ryan, vous devrez passer à un autre système de représentation numérique.La solution est en dehors du domaine des mathématiques à virgule flottante car vous avez besoin que pi soit représenté comme une décimale infiniment longue, donc 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).

Votre question me semble un peu étrange, car vous semblez suggérer que les mathématiques à virgule flottante sont implémentées par le langage.Ce n'est généralement pas vrai, car les calculs FP sont effectués à l'aide d'un processeur matériel à virgule flottante.Mais logiciel ou matériel, la virgule flottante sera toujours inexacte.C'est comme ça 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.Certains langages ont des bibliothèques intégrées pour cela (je sais que Java a BigInteger et BigDecimal), mais vous devrez utiliser explicitement ces bibliothèques au lieu de types natifs, et les performances seraient (parfois considérablement) pires que si vous utilisiez des flotteurs.

@Ryan Fox

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

Les types de données complexes natifs sont loin d’être inconnus.Fortran l'avait au milieu des années soixante, et le PO présente une variété d'autres langages qui les prennent en charge dans son suivi.

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 à ce problème, le « non-accord » n'est qu'une expression d'une 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) (Au moins si vous utilisez un compilateur assez stupide)...

J'ai eu de très longues discussions autour d'un café 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 figures (4 côtés, 5, 6...100, 200) mais...Combien de côtés avez-vous en plus, cela ressemble plus à un cercle.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 changez le paramètre ∞ pour un très grand Int, vous aurez une très grande instance de pi.

Pareil avec e, donnez-moi un paramètre énorme, je vous donnerai un e énorme.

Rassembler toutes les idées :

Comme nous avons des limitations de mémoire, le langage et les bibliothèques nous fournissent d'énormes exemples 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

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

Dans un langage qui n'a pas de représentation native, il est généralement ajouté en utilisant la POO pour créer un Complex classe à représenter i et j, avec une surcharge des opérateurs pour gérer correctement les opérations impliquant d'autres Complex nombres et/ou autres primitives numériques natives du langage.

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

L'analyse numérique nous enseigne qu'on ne peut pas se fier à la valeur précise de petites différences entre de grands nombres.

Cela n'affecte pas seulement l'équation en question ici, mais peut entraîner une instabilité dans tout, depuis la résolution d'un ensemble presque singulier d'équations simultanées, en passant par la recherche des zéros des polynômes, jusqu'à 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 ce problème).

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

Je suis désolé, cela fait 43 ans que je n'ai pas entendu ça à 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ère ce comme 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 d'informatique à l'époque.Je n'ai pas vraiment une idée de la place/de l'importance de l'analyse numérique dans un cours CS moderne.

C'est une limitation de nos architectures informatiques à virgule flottante actuelles.L'arithmétique à virgule flottante n'est qu'une approximation des pôles numériques comme e ou pi (ou tout ce qui dépasse la précision permise par vos bits).J'apprécie vraiment ces nombres car ils défient toute classification et semblent avoir une plus grande entropie (?) que même les nombres premiers, qui sont une série canonique.La représentation numérique d'un ratio défie, parfois des choses simples comme celle-là peuvent époustoufler une personne (j'adore ça).

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

Considérez une bibliothèque/un langage qui décrit des concepts tels que 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 entre le rayon et la circonférence est de 2*pi*r = C).Un objet comme pi n'est décrit que par le rapport susmentionné.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 le 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" de Wikipédia.

Question amusante.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top