Domanda

La maggior parte dei matematici concorda sul fatto che:

eπi + 1 = 0

Tuttavia, la maggior parte delle implementazioni in virgola mobile non sono d'accordo.Quanto bene possiamo risolvere questa controversia?

Sono ansioso di conoscere linguaggi e implementazioni diversi e vari metodi per rendere il risultato il più vicino possibile allo zero.Essere creativo!

È stato utile?

Soluzione

Non è che la maggior parte delle implementazioni in virgola mobile non siano d'accordo, è solo che non riescono a ottenere la precisione necessaria per ottenere una risposta al 100%.E la risposta corretta è che non possono.

PI è una serie infinita di cifre che nessuno è stato in grado di denotare con qualcosa di diverso da una rappresentazione simbolica, ed e^X è lo stesso, e quindi l'unico modo per ottenere una precisione del 100% è diventare simbolico.

Altri suggerimenti

Ecco un breve elenco di implementazioni e linguaggi che ho provato.È ordinato in base alla vicinanza allo zero:

  • Schema: (+ 1 (make-polar 1 (atan 0 -1)))
    • 0.0+1.2246063538223773e-16i (Schema Chez, Schema MIT)
    • 0.0+1.22460635382238e-16i (Astuzia)
    • 0.0+1.22464679914735e-16i (Pollo con numbers uovo)
    • 0.0+1.2246467991473532e-16i (MzScheme, SISC, Gauche, Gambit)
    • 0.0+1.2246467991473533e-16i (SCM)
  • Lisp comune: (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
  • Pitone: from cmath import exp, pi; exp(complex(0, pi)) + 1
    • 1.2246467991473532e-16j (CPython)
  • Rubino: require 'complex'; Complex::polar(1, Math::PI) + 1
    • Complex(0.0, 1.22464679914735e-16) (MRI)
    • Complex(0.0, 1.2246467991473532e-16) (JRubino)
  • R: complex(argument = pi) + 1
    • 0+1.224606353822377e-16i

È possibile risolvere questa controversia?

Il mio primo pensiero è guardare a un linguaggio simbolico, come acero.Non penso però che conti come virgola mobile.

In effetti, come si rappresenta? io (O J per gli ingegneri) in un linguaggio di programmazione convenzionale?

Forse un esempio migliore è sin(π) = 0?(O ho mancato di nuovo il punto?)

Sono d'accordo con Ryan, dovresti passare a un altro sistema di rappresentazione dei numeri.La soluzione è al di fuori del regno della matematica in virgola mobile perché è necessario che pi venga rappresentato come un decimale infinitamente lungo, quindi qualsiasi schema di precisione limitata semplicemente non funzionerà (almeno non senza impiegare una sorta di fattore di confusione per compensare la perdita precisione).

La tua domanda mi sembra un po' strana, poiché sembra che tu stia suggerendo che la matematica in virgola mobile è implementata dal linguaggio.In genere questo non è vero, poiché i calcoli FP vengono eseguiti utilizzando un processore a virgola mobile nell'hardware.Ma software o hardware, la virgola mobile sarà sempre imprecisa.È proprio così che funzionano i galleggianti.

Se hai bisogno di una maggiore precisione devi utilizzare una rappresentazione numerica diversa.Proprio come se stessi facendo calcoli con numeri interi su numeri che non rientrano in un int o in un long.Alcuni linguaggi hanno librerie integrate per questo (so che Java ha BigInteger e BigDecimal), ma dovresti usare esplicitamente quelle librerie invece dei tipi nativi e le prestazioni sarebbero (a volte significativamente) peggiori che se utilizzassi i float.

@Ryan Fox

In effetti, come si rappresenta i (o j per gli ingegneri) in un linguaggio di programmazione convenzionale?

I tipi di dati complessi nativi sono tutt'altro che sconosciuti.Fortran lo possedeva verso la metà degli anni Sessanta e l'OP presenta una varietà di altri linguaggi che li supportano nel suo seguito.

E i numeri complessi possono essere aggiunti ad altri linguaggi come librerie (con l'overload degli operatori sembrano addirittura tipi nativi nel codice).

Ma a meno che non si fornisca un caso speciale per questo problema, il "non accordo" è solo un'espressione di un'aritmetica imprecisa della macchina, no?E' come lamentarsene

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

termina con (t != 0) (almeno se usi un compilatore abbastanza stupido)...

Ho fatto moooolte chiacchiere al caffè con il mio migliore amico parlando dei numeri irrazionali e della differenza tra gli altri numeri.Ebbene, siamo entrambi d'accordo su questo diverso punto di vista:

I numeri irrazionali sono relazioni, come funzioni, in un certo senso, in che modo?Beh, pensa a "se vuoi un cerchio perfetto, dammi un pi greco perfetto", ma i cerchi sono diversi dalle altre figure (4 lati, 5, 6...100, 200) ma...Quanti altri lati hai? Sembra più un cerchio.Se mi hai seguito finora, collegando tutte queste idee ecco la formula pi greco:enter image description here

Quindi pi greco è una funzione, ma che non finisce mai!a causa del parametro ∞, ma mi piace pensare che puoi avere un'"istanza" di pi greco, se cambi il parametro ∞ per un Int molto grande, avrai un'istanza pi greco molto grande.

Lo stesso con e, dammi un parametro enorme, ti darò una e enorme.

Mettendo insieme tutte le idee:

Dato che abbiamo limiti di memoria, il linguaggio e le librerie ci forniscono enormi esempi di numeri irrazionali, in questo caso pi ed e, come risultato finale, avrai un lungo approccio per ottenere 0, come gli esempi forniti da @Chris Jester-Young

In effetti, come si rappresenta i (o j per gli ingegneri) in un linguaggio di programmazione convenzionale?

In una lingua che non ha una rappresentazione nativa, di solito viene aggiunta utilizzando l'OOP per creare un file Complex classe da rappresentare i E j, con sovraccarico dell'operatore per gestire adeguatamente le operazioni che coinvolgono altri Complex numeri e/o altri numeri primitivi nativi della lingua.

Per esempio: Complesso.java, C++ <complesso>

L'analisi numerica ci insegna che non è possibile fare affidamento sul valore preciso delle piccole differenze tra grandi numeri.

Ciò non influisce solo sull'equazione in questione qui, ma può portare instabilità a tutto, dalla risoluzione di un insieme quasi singolare di equazioni simultanee, alla ricerca degli zeri dei polinomi, alla valutazione di log(~1) o exp(~0) ( Ho anche visto funzioni speciali per valutare log(x+1) e (exp(x)-1) per aggirare questo problema).

Ti incoraggio a non pensare in termini di azzeramento della differenza - non puoi - ma piuttosto a fare i calcoli associati in modo tale da garantire l'errore minimo.

Mi dispiace, sono passati 43 anni dall'ultima volta che mi è stata inculcata questa cosa all'università, e anche se potessi ricordare i riferimenti, sono sicuro che ci sia roba migliore in giro adesso.suggerisco Questo come punto di partenza.


Se questo suona un po' condiscendente, me ne scuso.La mia "Analisi Numerica 101" faceva parte del mio corso di Chimica, poiché a quei tempi non c'erano molte CS.Non ho davvero la sensazione del posto / dell'importanza che l'analisi numerica ha in un moderno corso di informatica.

È una limitazione delle nostre attuali architetture computazionali in virgola mobile.L'aritmetica in virgola mobile è solo un'approssimazione di poli numerici come e o pi (o qualsiasi cosa oltre la precisione consentita dai bit).Mi piacciono molto questi numeri perché sfidano la classificazione e sembrano avere un'entropia maggiore (?) anche dei numeri primi, che sono una serie canonica.Un rapporto sfida la rappresentazione numerica, a volte cose semplici come queste possono lasciare a bocca aperta una persona (lo adoro).

Per fortuna interi linguaggi e librerie possono essere dedicati a funzioni trigonometriche di precisione utilizzando concetti di notazione (simili a quelli descritti da Lasse V.Karlsen ).

Considera una libreria/linguaggio che descriva concetti come e e pi in una forma comprensibile da una macchina.Una macchina ha qualche idea di cosa sia un cerchio perfetto?Probabilmente no, ma possiamo creare un oggetto-cerchio che soddisfi tutte le caratteristiche conosciute che gli attribuiamo (raggio costante, rapporto tra raggio e circonferenza è 2*pi*r = C).Un oggetto come pi greco è descritto solo dal rapporto sopra menzionato.r&C possono essere oggetti numerici descritti con qualunque precisione tu voglia dare loro.e può essere definito "poiché e è l'unico numero reale tale che il valore della derivata (pendenza della retta tangente) della funzione f(x) = ex nel punto x = 0 è esattamente 1" da Wikipedia.

Domanda divertente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top