
Οι περισσότεροι μαθηματικοί συμφωνούν ότι:



> 
> e πi + 1 = 0
> 
> 
> 


Ωστόσο, οι περισσότερες εφαρμογές κινητής υποδιαστολής διαφωνούν. Πόσο καλά μπορούμε να διευθετηθεί αυτή η διαφορά;


Είμαι πρόθυμος να ακούσω για διαφορετικές γλώσσες και εφαρμογές, καθώς και διάφορες μεθόδους για να κάνουν το αποτέλεσμα όσο πιο κοντά στο μηδέν είναι δυνατόν. Να είσαι δημιουργικός!

 
Μια μικρή εκτροπή σε κινητής υποδιαστολής (im) την ακρίβεια, μέρος 1
====================================================================



Δεν είναι ότι οι περισσότερες εφαρμογές κινητής υποδιαστολής διαφωνούν, είναι ακριβώς ότι δεν μπορούν να πάρουν την απαραίτητη ακρίβεια για να πάρετε μια απάντηση 100%. Και η σωστή απάντηση είναι ότι δεν μπορούν.


PI είναι μια άπειρη σειρά από ψηφία που κανείς δεν ήταν σε θέση να δηλώσει με οτιδήποτε άλλο εκτός από μια συμβολική αναπαράσταση, και ε ^ Χ είναι το ίδιο, και έτσι ο μόνος τρόπος για να φτάσουμε στο 100% ακρίβεια είναι να πάει συμβολική.

 

Εδώ είναι μια σύντομη λίστα των εφαρμογών και των γλωσσών που έχω δοκιμάσει. Είναι ταξινομημένο κατά εγγύτητα στο μηδέν:


* Σχέδιο: `(+ 1 (make-polar 1 (atan 0 -1)))`
	+ ⇒ `0.0+1.2246063538223773e-16i`(Chez Σχήμα, το Σχήμα ΜΙΤ)
	+ ⇒ `0.0+1.22460635382238e-16i`(Guile)
	+ ⇒ `0.0+1.22464679914735e-16i`(κοτόπουλο με `numbers`αυγό)
	+ ⇒ `0.0+1.2246467991473532e-16i`(MzScheme, SISC, Gauche, τεχνάσματος)
	+ ⇒ `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`
* Πύθων: `from cmath import exp, pi; exp(complex(0, pi)) + 1`
	+ ⇒ `1.2246467991473532e-16j`(CPython)
* Ρουμπίνι: `require 'complex'; Complex::polar(1, Math::PI) + 1`
	+ ⇒ `Complex(0.0, 1.22464679914735e-16)`(MRI)
	+ ⇒ `Complex(0.0, 1.2246467991473532e-16)`(JRuby)
* R: `complex(argument = pi) + 1`
	+ ⇒ `0+1.224606353822377e-16i`

 

Είναι δυνατόν να διευθετηθεί αυτή η διαμάχη;


Η πρώτη μου σκέψη είναι να κοιτάξουμε σε μια συμβολική γλώσσα, όπως το [Maple](http://en.wikipedia.org/wiki/Maple_(software)) . Δεν νομίζω ότι μετράει κινητής υποδιαστολής όμως.


Στην πραγματικότητα, πώς μπορεί κανείς να εκπροσωπεί *i* (ή *j* για τους μηχανικούς) σε μια συμβατική γλώσσα προγραμματισμού;


Ίσως ένα καλύτερο παράδειγμα είναι η αμαρτία (π) = 0; (Ή έχω χάσει και πάλι το σημείο;)

 

Συμφωνώ με τον Ryan, θα πρέπει να μετακινηθούν σε άλλο αριθμητικό σύστημα εκπροσώπησης. Η λύση είναι έξω από τη σφαίρα της κινητής υποδιαστολής μαθηματικά γιατί θα πρέπει pi να εκπροσωπούνται ως απείρως μεγάλο δεκαδικά έτσι ώστε οποιαδήποτε περιορισμένο σύστημα ακρίβεια απλά δεν πρόκειται να λειτουργήσει (τουλάχιστον όχι χωρίς να χρησιμοποιούν κάποιο είδος φοντάν παράγοντα για να αναπληρώσετε το χαμένο ακρίβεια).

 

@Ryan Fox 


> Στην πραγματικότητα, πώς μπορεί κανείς να εκπροσωπεί i (ή j για τους μηχανικούς) σε μια συμβατική γλώσσα προγραμματισμού;


Native σύνθετους τύπους δεδομένων δεν είναι καθόλου άγνωστη. Fortran είχε από τα μέσα της δεκαετίας του εξήντα, και το ΕΠ παρουσιάζει μια σειρά από άλλες γλώσσες που τις υποστηρίζουν στο ιστορ παρακολούθησης.


Και μιγαδικών αριθμών μπορεί να προστεθεί σε άλλες γλώσσες, όπως βιβλιοθήκες (με χειριστή υπερφόρτωση φαίνονται ακόμη σαν μητρική τους τύπους στον κώδικα).


Αλλά αν δεν παρέχουν μια ειδική περίπτωση για αυτό το πρόβλημα, το «μη συμφωνίας» είναι απλώς μια έκφραση ανακριβής αριθμητική μηχανή, έτσι δεν είναι; Είναι σαν να διαμαρτύρεται ότι



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

```

τελειώνει με (t! = 0) (Τουλάχιστον αν χρησιμοποιείτε μια αρκετά χαζός compiler) ...

 

Η ερώτησή σας φαίνεται λίγο περίεργο για μένα, όπως φαίνεται να υποδηλώνει ότι τα μαθηματικά Floating Point υλοποιείται από τη γλώσσα. Αυτό γενικά δεν είναι αλήθεια, όπως τα μαθηματικά ΠΠ γίνεται με τη χρήση ενός επεξεργαστή κινητής υποδιαστολής σε hardware. Αλλά λογισμικού ή υλικού, κινητής υποδιαστολής πάντα θα είναι ανακριβής. Αυτό είναι ακριβώς το πώς επιπλέει εργασίας.


Αν χρειάζεστε μεγαλύτερη ακρίβεια θα πρέπει να χρησιμοποιήσετε ένα διαφορετικό αριθμό εκπροσώπηση. Ακριβώς όπως και αν κάνετε ακέραιο μαθηματικά σε αριθμούς που δεν ταιριάζουν σε int ή μακροπρόθεσμα. Μερικές γλώσσες έχουν βιβλιοθήκες γι 'αυτό χτίστηκε το (ξέρω java έχει BigInteger και BigDecimal), αλλά θα πρέπει να χρησιμοποιούν ρητά αυτές τις βιβλιοθήκες, αντί των ιθαγενών ειδών, και η απόδοση θα είναι (μερικές φορές πολύ) χειρότερα από ό, τι αν χρησιμοποιηθεί άρματα.

 


> 
> Στην πραγματικότητα, πώς μπορεί κανείς να εκπροσωπεί i (ή j για τους μηχανικούς) σε μια συμβατική γλώσσα προγραμματισμού;
> 
> 
> 


Σε μια γλώσσα που δεν έχει μια εγγενή αναπαράσταση, που προστίθεται συνήθως με τη χρήση OOP να δημιουργήσει μια `Complex`τάξη να εκπροσωπεί `i`και `j`, μαζί με το χειριστή υπερφόρτωση να ασχοληθεί σωστά με πράξεις που αφορούν άλλους `Complex`αριθμούς ή άλλο αριθμό πρωτόγονων μητρική τη γλώσσα.


Π.χ.: [Complex.java](http://www.math.ksu.edu/~bennett/jomacg/c.html) , [C ++ <σύμπλοκο>](http://msdn.microsoft.com/en-us/library/0352zzhd%28VS.80%29.aspx)

 

Αριθμητική Ανάλυση μας διδάσκει ότι δεν μπορεί να επικαλεστεί την ακριβή αξία των μικρών διαφορών μεταξύ μεγάλων αριθμών. 


Αυτό δεν επηρεάζει μόνο την εξίσωση στο ερώτημα εδώ, αλλά μπορεί να φέρει αστάθεια στα πάντα, από την επίλυση ενός σχεδόν μοναδικό σύνολο ταυτόχρονων εξισώσεων, μέσα από την εξεύρεση των μηδενικά πολυώνυμα, την αξιολόγηση log (~ 1) ή exp (~ 0) ( έχω δει ακόμη και ειδικές λειτουργίες για την αξιολόγηση log (x + 1) και (exp (x) -1) για να πάρει γύρω από αυτό).


Θα ήθελα να σας ενθαρρύνω να μην σκέφτονται από την άποψη της μηδενισμό της διαφοράς - δεν μπορεί - αλλά μάλλον στο να κάνει τις σχετικές υπολογισμούς με τέτοιο τρόπο ώστε να εξασφαλίζεται το ελάχιστο σφάλμα.


Λυπάμαι, είναι 43 χρόνια από τότε που είχα αυτό το τύμπανο σε μένα σε πανεπιστήμιο, ακόμα και αν θα μπορούσα να θυμάμαι τις αναφορές, είμαι σίγουρος ότι υπάρχουν καλύτερα πράγματα γύρω από τώρα. Προτείνω ***[αυτό](http://en.wikipedia.org/wiki/Numerical_analysis#The_generation_and_propagation_of_errors)*** ως σημείο εκκίνησης.




---


Αν αυτό ακούγεται λίγο συγκαταβατική, ζητώ συγγνώμη. Μου «Αριθμητική Ανάλυση 101» ήταν μέρος των σπουδών Χημείας μου, καθώς δεν υπήρχαν πολλά CS σε εκείνες τις ημέρες. Πραγματικά, δεν έχουν μια αίσθηση για τον τόπο / σημασία αριθμητική ανάλυση έχει σε ένα σύγχρονο γήπεδο CS.

 

Είναι ένας περιορισμός της τρέχουσας κινητής υποδιαστολής υπολογιστικών αρχιτεκτονικών μας. Κινητής υποδιαστολής αριθμητική είναι μόνο μια προσέγγιση των αριθμητικών πόλων, όπως ε ή π (ή οτιδήποτε πέρα ​​από την ακρίβεια κομμάτια σας επιτρέπουν). Μου αρέσει πολύ αυτούς τους αριθμούς, διότι αψηφούν την ταξινόμηση, και φαίνεται να έχει μεγαλύτερη εντροπία (;) από ό, τι ακόμη πρώτοι, που είναι μια κανονική σειρά. αριθμητική αναπαράσταση ενός δείκτη Defy είναι, μερικές φορές απλά πράγματα, όπως ότι μπορεί να φυσήξει το μυαλό ενός ατόμου (μου αρέσει).


Ευτυχώς ολόκληρο γλώσσες και βιβλιοθήκες μπορεί να διατεθεί για την ακρίβεια τριγωνομετρικές λειτουργίες, χρησιμοποιώντας συμβολισμούς έννοιες (παρόμοιες με αυτές που περιγράφονται από τον [Lasse Β Κάρλσεν](https://stackoverflow.com/users/267/lasse-v-karlsen) ).


Σκεφτείτε μια βιβλιοθήκη / γλώσσα που περιγράφει έννοιες όπως το e και π σε μια μορφή που μια μηχανή μπορεί να καταλάβει. Έχει μια μηχανή έχει καμία ιδέα για το τι ένας τέλειος κύκλος είναι; Πιθανώς όχι, αλλά μπορούμε να δημιουργήσουμε ένα αντικείμενο - κύκλο που ικανοποιεί όλες τις γνωστές λειτουργίες αποδίδουμε σε αυτό (σταθερή ακτίνα, η σχέση της ακτίνας προς την περιφέρεια είναι 2 * pi * r = C). Ένα αντικείμενο όπως π περιγράφεται μόνο από την προαναφερθείσα αναλογία. r & C μπορεί να είναι αριθμητικό αντικείμενα που περιγράφονται από ό, τι την ακρίβεια που θέλετε να τους δώσετε. e μπορεί να οριστεί «ως το e είναι ο μοναδικός πραγματικός αριθμός έτσι ώστε η αξία του παραγώγου (κλίση της γραμμής εφαπτομένης) της συνάρτησης f (x) = ex στο σημείο x = 0 είναι ακριβώς 1» από [wikipedia](http://en.wikipedia.org/wiki/E_(mathematical_constant)) .


Fun ερώτηση.

 

Είχα looooong συνομιλίες καφέ με καλύτερο φίλε μου μιλάμε για άρρητους αριθμούς και την diference μεταξύ άλλων αριθμών. Λοιπόν, οι δυο μας συμφωνούμε σε αυτό διαφορετική άποψη:


Παράλογη αριθμοί είναι οι σχέσεις, όπως λειτουργεί, κατά κάποιο τρόπο, ποιο τρόπο; Λοιπόν, σκεφτείτε «εάν θέλετε έναν τέλειο κύκλο, να μου δώσει μια τέλεια π», αλλά οι κύκλοι diferent με τα άλλα στοιχεία (4 πλευρές, 5, 6 ... 100, 200), αλλά ... Πόσες περισσότερες πλευρές κάνουν θα πρέπει, περισσότερο σαν ένα κύκλο μοιάζει. Αν με ακολούθησε μέχρι τώρα, που συνδέει όλα αυτά ιδέες εδώ είναι ο τύπος pi:
[![εισάγετε περιγραφή της εικόνας εδώ](https://i.stack.imgur.com/uM2PX.gif)](https://i.stack.imgur.com/uM2PX.gif)


Έτσι, pi είναι συνάρτηση, αλλά μια που δεν τελειώνει ποτέ! λόγω της παραμέτρου ∞, αλλά θέλω να πιστεύω ότι μπορείτε να έχετε «παράδειγμα» του π, εάν αλλάξετε την παράμετρο ∞ για ένα πολύ μεγάλο Int, θα έχετε ένα πολύ μεγάλο βαθμό πίν.


Ίδιο με το e, να μου δώσει ένα τεράστιο παράμετρο, θα σας δώσω ένα τεράστιο e.


Κάνοντας όλες τις ιδέες μαζί:


Όπως έχουμε περιορισμούς μνήμη, η γλώσσα και libs μας παρέχετε τεράστιο παράδειγμα της άρρητους αριθμούς, σε αυτή την περίπτωση, π και ε, ως τελικό αποτέλεσμα, θα έχετε μεγάλη aproach να πάρει 0, όπως τα παραδείγματα που παρέχονται από @ Chris Jester-Young

 