Une petite déviation en virgule flottante (im) de précision, partie 1

voix
16

La plupart des mathématiciens conviennent que:

e πi + 1 = 0

Cependant, la plupart des implémentations de points de désaccord Floating. Dans quelle mesure pouvons-nous régler ce différend?

Je suis impatient d'entendre parler des langues différentes et mises en œuvre, et diverses méthodes pour rendre le résultat aussi proche que possible de zéro. Sois créatif!

Créé 04/08/2008 à 07:21
source utilisateur
Dans d'autres langues...                            


10 réponses

voix
16

Ce n'est pas que la plupart des implémentations de virgule flottante en désaccord, il est juste qu'ils ne peuvent pas obtenir la précision nécessaire pour obtenir une réponse de 100%. Et la bonne réponse est qu'ils ne peuvent pas.

PI est une série infinie de chiffres que personne n'a été en mesure de désigner par autre chose qu'une représentation symbolique, et e ^ X est le même, et donc la seule façon d'obtenir à 100% de précision est d'aller symbolique.

Créé 26/12/2008 à 21:22
source utilisateur

voix
8

Voici une courte liste des implémentations et des langues que je l'ai essayé. Il est trié par proximité à 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(Guile)
    • 0.0+1.22464679914735e-16i(Poulet aux numbersœufs)
    • 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
Créé 04/08/2008 à 07:22
source utilisateur

voix
5

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

Ma première pensée est de se tourner vers un langage symbolique, comme Maple . Je ne pense pas que compte comme virgule flottante bien.

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

Peut-être un meilleur exemple est le péché (π) = 0? (Ou ai-je manqué le point à nouveau?)

Créé 04/08/2008 à 07:29
source utilisateur

voix
4

Votre question semble un peu étrange pour moi, comme vous semblez dire que le calcul à virgule flottante est mis en œuvre par la langue. C'est généralement pas vrai, comme le calcul FP est effectuée à l'aide d'un processeur à virgule flottante dans le matériel. Mais le logiciel ou le matériel, virgule flottante sera toujours inexacte. C'est à quel point flotte travail.

Si vous avez besoin d'une plus grande précision, vous devez utiliser une représentation de numéro différent. Tout comme si vous faites des mathématiques entier sur des chiffres qui ne correspondent pas à un int ou long. Certaines langues ont des bibliothèques pour cette construction (je sais que Java a BigInteger et BigDecimal), mais vous devez utiliser explicitement les bibliothèques au lieu de types natifs, et les performances seraient (parfois beaucoup) pire que si vous avez utilisé des flotteurs.

Créé 25/08/2008 à 14:37
source utilisateur

voix
4

@Ryan Fox

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

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

Et les nombres complexes peuvent être ajoutés à d'autres langues que les bibliothèques (avec l'opérateur, ils regardent même la surcharge comme types natifs dans le code).

Mais à moins que vous fournissez un cas particulier pour ce problème, la « non-accord » est juste une expression de l'arithmétique de la machine imprécise, non? Il est comme se plaindre que

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) ...

Créé 25/08/2008 à 14:29
source utilisateur

voix
4

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 pi à représentée comme une décimale infiniment longue de sorte que tout système de précision limitée tout ne va pas travailler (au moins pas sans employer une sorte de facteur fudge pour compenser la perte précision).

Créé 25/08/2008 à 02:10
source utilisateur

voix
2

J'ai eu des conversations de café looooong avec mon meilleur ami parler de chiffres et Irrational la diference entre autres numéros. Eh bien, tous les deux sont d'accord pour ce point de vue différent:

Les nombres irrationnels sont des relations, comme les fonctions, d'une manière, de quelle manière? Eh bien, pensez à « si vous voulez un cercle parfait, donnez-moi un pi parfait », mais les cercles sont Diferent aux autres figures (4 côtés, 5, 6 ... 100, 200), mais ... Combien de côtés font vous avez, plus comme un cercle ressembler. Si vous me suiviez jusqu'à présent, reliant toutes ces idées ici est la formule pi: entrez la description d'image ici

Ainsi, pi est une fonction, mais qui ne finit jamais! à cause du paramètre ∞, mais je me plais à penser que vous pouvez avoir « instance » de pi,, vous aurez une très grande instance de pi si vous modifiez le paramètre ∞ pour un très grand Int.

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

Mettre toutes les idées ensemble:

Comme nous avons des limites de mémoire, la langue et libs nous fournir à grand exemple des nombres irrationnels, dans ce cas, pi et e, comme résultat final, vous aurez de temps aproche pour obtenir 0, comme les exemples fournis par @ Chris Jester-Young

Créé 06/05/2017 à 03:07
source utilisateur

voix
2

Il est une limitation de nos actuels architectures de calcul en virgule flottante. arithmétique à virgule flottante est une approximation de pôles numériques comme e ou pi (ou quoi que ce soit au-delà de la précision de vos morceaux permettent). J'apprécie vraiment ces chiffres parce qu'ils défient toute classification, et semblent avoir une plus grande entropie (?) Que même les nombres premiers, qui sont une série canonique. Un rapport Defy de représentation numérique, parfois des choses simples comme ça peut souffler l'esprit d'une personne (je l'aime).

Heureusement langues entières et les bibliothèques peuvent être dédiées à des fonctions trigonométriques précision en utilisant des concepts similaires (notationnelles à celles décrites par Lasse V. Karlsen ).

Considérons une bibliothèque / langage qui décrit des concepts tels que e et pi sous une forme qu'une machine peut comprendre. Est -ce une machine ont une idée de ce qu'est un cercle parfait est? Probablement pas, mais nous pouvons créer un objet - cercle qui satisfait toutes les caractéristiques connues que nous attribuons (rayon constant, rapport de rayon de circonférence est 2 * pi * r = C). Un objet comme pi est seulement décrit par le rapport mentionné ci - dessus. r & C peuvent être des objets numériques décrits par quelque précision que vous voulez leur donner. e peut être défini « que l'e est le nombre réel unique , de telle sorte que la valeur de la dérivée (pente de la droite tangente) de la fonction f (x) = ex au point x = 0 est exactement 1 » de wikipedia .

question de plaisir.

Créé 20/11/2009 à 21:37
source utilisateur

voix
2

Analyse numérique nous apprend que vous ne pouvez pas compter sur la valeur précise de petites différences entre un grand nombre.

Cela ne concerne pas seulement l'équation en question, mais peut apporter l'instabilité à tout, de résoudre un ensemble quasi unique d'équations simultanées, en trouvant les zéros de polynômes, d'évaluer log (~ 1) ou exp (~ 0) ( J'ai même vu des fonctions spéciales pour l'évaluation de log (x + 1) et (exp (x) -1) pour contourner cela).

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

Je suis désolé, il est 43 ans que j'ai eu ce seriné moi à uni, et même si je pouvais me rappeler les références, je suis sûr qu'il ya des choses plus autour de nous maintenant. Je suggère ce comme point de départ.


Si cela semble un peu condescendant, je présente mes excuses. Mon « Analyse numérique 101 » faisait partie de mon cours de chimie, car il n'y avait pas beaucoup de CS dans ces jours. Je n'ai pas vraiment une idée de l'endroit / importance analyse numérique a un cours CS moderne.

Créé 26/12/2008 à 22:22
source utilisateur

voix
2

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

Dans une langue qui ne dispose pas d' une représentation native, il est généralement ajouté à l' aide OOP pour créer une Complexclasse pour représenter iet j, avec la surcharge d' opérateur de traiter correctement les opérations impliquant d' autres Complexnuméros et ou d' autres primitives numériques natifs de la langue.

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

Créé 25/08/2008 à 14:48
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more