Rappresenta un numero reale senza perdita di precisione


10

L'attuale virgola mobile (ANSI C float, double) consente di rappresentare un'approssimazione di un numero reale.
Esiste un modo per rappresentare numeri reali senza errori ?
Ecco un'idea che ho avuto, che è tutt'altro che perfetto.

Ad esempio, 1/3 è 0.33333333 ... (base 10) o o.01010101 ... (base 2), ma anche 0.1 (base 3)
È una buona idea implementare questa "struttura":

base, mantissa, exponent

quindi 1/3 potrebbe essere 3 ^ -1

{[11] = base 3, [1.0] mantissa, [-1] exponent}

Altre idee?


12
Sarai in grado di rappresentare solo numeri razionali in questo modo.
Andrej Bauer,

Come proponete di implementare operazioni aritmetiche sui numeri in questa rappresentazione? Usando i logaritmi per cambiare base? Questo sarebbe molto più costoso della matematica in virgola mobile IEEE.
David Zhang,

Bene, non ne ho idea. Non sono un ingegnere :) Ovviamente, non posso implementarlo nell'hardware. Un'implementazione lenta e inefficiente può essere fatta in C. Questo sarebbe solo un esperimento
incluso il

Risposte:


20

Dipende tutto da cosa vuoi fare.

Ad esempio, ciò che mostri è un ottimo modo per rappresentare numeri razionali. Ma non può ancora rappresentare qualcosa come o e perfettamente.πe

In effetti, molte lingue come Haskell e Scheme hanno integrato il supporto per numeri razionali, memorizzandoli nella forma dovea,bsono numeri interi.aba,b

Il motivo principale per cui questi non sono ampiamente utilizzati sono le prestazioni. I numeri in virgola mobile sono un po 'imprecisi, ma le loro operazioni sono implementate nell'hardware. Il sistema proposto consente una maggiore precisione, ma richiede diversi passaggi da implementare, al contrario di una singola operazione che può essere eseguita in hardware.

È noto che alcuni numeri reali sono incontestabili, come i numeri di arresto . Non v'è alcun algoritmo di enumerazione sue cifre, a differenza di , dove siamo in grado di calcolare il n ° cifre più a lungo aspettiamo abbastanza a lungo.πn

Se vuoi una vera precisione per cose irrazionali o numeri trascendentali, probabilmente avresti bisogno di usare una sorta di sistema di algebra simbolica, quindi ottenere una risposta finale in forma simbolica, che potresti approssimare a qualsiasi numero di cifre. Tuttavia, a causa dei problemi di indecidibilità descritti sopra, questo approccio è necessariamente limitato. È ancora buono per cose come integrali approssimativi o serie infinite.


Posso fare un'altra domanda? Se fossi stato un ingegnere Intel negli anni '80, come avresti "progettato" il tuo formato di numero reale?
include l'

3
Non sono molto qualificato per rispondere che, poiché non sono un ingegnere, sono un ricercatore di teoria. Non vedo molto male con IEEE float e doppi standard, e ora quad. Non credo che ci siano state molte applicazioni a seconda dell'aritmetica di precisione più elevata e quelle che lo fanno possono usare una versione supportata dal software.
jmite,

L'algebra simbolica non è il formalismo corretto per l'esatta aritmetica reale. Hai bisogno di una rappresentazione che consenta mantisse arbitrariamente grandi.
Andrej Bauer,

8
@AndrejBauer: una mantissa arbitrariamente grande non ti salverà se vuoi una rappresentazione esatta di . 2
user2357112 supporta Monica

@jmite sei troppo modesto :)
incluso il

22

Non c'è modo di rappresentare tutti i numeri reali senza errori se ogni numero deve avere una rappresentazione finita. Esistono innumerevoli numeri reali, ma solo molte stringhe finite di 1 e 0 che è possibile utilizzare per rappresentarli.


Si potrebbe limitare il requisito di rappresentare ogni numero reale a limitare solo quei numeri reali, che potrebbero essere l'output di una macchina da turismo. Sarebbe solo un numero numerabile di numeri reali, ma coprirebbe comunque ogni numero che avresti mai voluto rappresentare. Ma non credo che potresti fare calcoli efficienti con tali numeri.
Kasperd,

3
@kasperd Si chiamano reals calcolabili . Sfortunatamente, cose come l'uguaglianza non sono calcolabili rispetto ai reali calcolabili.
David Richerby,

È infatti abbastanza chiaro che la parità di calcolo su tali numeri equivale a risolvere il problema di arresto. Dato un TM si può definire un numero reale, che inizia con molti decimali che sono zero, esattamente quanti sono i tempi di esecuzione del TM, e quindi seguito da uno. Confrontare quel numero con zero equivale a risolvere il problema di arresto per la TM originale.
Kasperd,

Questa risposta è falsa Alan Turing nel suo primo articolo sulle macchine, quelle in cui inventa le macchine Turing, parla di rappresentare i reali come infinite stringhe di dati. Ciò porta all'idea della cosiddetta "macchina di Turing di tipo II", e esiste una teoria di successo del calcolo dei numeri reali basata sull'idea. È anche implementato in pratica, vedi la mia risposta.
Andrej Bauer,

1
Forse lo fa tecnicamente, ma manca il punto, che è che ci sono rappresentazioni infinite perfettamente ragionevoli di numeri reali. E non è niente di strano: una connessione TCP / IP, una chiamata Skype o un feed video da una telecamera sono tutti esempi di (potenzialmente) infinita quantità di dati. Non vi è alcuna limitazione a priori sulla quantità di informazioni che possono fornire. C'è solo una limitazione sulla quantità di informazioni che è possibile ricavarne in un tempo limitato.
Andrej Bauer,

7

La tua idea non funziona perché un numero rappresentato nella base con mantissa me esponente e è il numero razionale b m - e , quindi la tua rappresentazione funziona esattamente per i numeri razionali e nessun altro. Non puoi rappresentare bmebme per esempio.2

C'è un'intera branca della matematica calcolabile che si occupa dell'aritmetica reale esatta. Sono state proposte molte strutture di dati per rappresentare numeri reali esatti : flussi di cifre, flussi di contrazioni affine, sequenze di razionali di Cauchy, sequenze di razionali diadici di Cauchy, tagli di Dedekind, sequenze di intervalli di shkrinking esatti, ecc. Esistono implementazioni di esatte basi aritmetiche reali su queste idee, ad esempio:

Di questi iRRAM è il più maturo ed efficiente. Marshall in un progetto sperimentale, mentre il terzo è un progetto studentesco, ma anche il più facilmente accessibile. Ha una bella introduzione che spiega le questioni relative al calcolo dei numeri reali, ti consiglio vivamente di guardarlo.

Vorrei fare un'osservazione. Qualcuno obietterà che un oggetto infinito non può essere rappresentato da un computer. In un certo senso questo è vero, ma in un altro non lo è. Non dobbiamo mai rappresentare un numero reale intero , abbiamo solo bisogno di un'approssimazione finitain ogni fase del calcolo. Pertanto, abbiamo solo bisogno di una rappresentazione che possa rappresentare un reale fino a una determinata precisione. Naturalmente, una volta esaurita la memoria del computer, la memoria del computer si esaurisce, ma questa è una limitazione del computer, non della rappresentazione stessa. Questa situazione non è diversa da molte altre in programmazione. Ad esempio, le persone usano numeri interi in Python e li considerano "arbitrariamente grandi" anche se ovviamente non possono superare le dimensioni della memoria disponibile. A volte l'infinito è un'approssimazione utile per un numero finito molto grande.

Inoltre, sento spesso l'affermazione secondo cui i computer possono gestire solo numeri reali calcolabili . Questo manca due punti importanti. In primo luogo, i computer hanno accesso ai dati dal mondo esterno, quindi dovremmo anche supporre (il non verificabile) che anche il mondo esterno sia calcolabile. In secondo luogo, dobbiamo distinguere tra ciò che un computer può calcolare e ciò che può rappresentare. Ad esempio, se scegliamo flussi di cifre come rappresentazione di reali, allora è perfettamente possibile rappresentare un reale non calcolabile: se qualcuno ce lo desse sapremmo come rappresentarlo. Ma se scegliamo di rappresentare i reali come pezzi di codice sorgente che calcolano le cifre, allora non potremmo rappresentare i reali non calcolabili, ovviamente.

In ogni caso, questo argomento è meglio affrontato con qualche ulteriore lettura.


+1 ma obietterei che non puoi rappresentare una stringa infinita con un'approssimazione finita senza perdere la precisione , come richiesto dalla domanda. Certo, puoi ottenere tutta la precisione che vuoi - come puoi approssimando con un razionale - ma non è proprio quello che la domanda ti sta chiedendo. Probabilmente, questo è un problema con la domanda, piuttosto che con la risposta.
David Richerby,

2
Il punto è che noi siamo non rappresentando con le stringhe finite. Stiamo rappresentando con stringhe infinite , ma abbiamo sempre e solo bisogno di una porzione finita di una stringa così infinita in ogni fase del calcolo. O per dirla in altro modo: non vi è alcuna perdita di precisioni, poiché la struttura dei dati contiene tutte le informazioni, ma ovviamente non è possibile accedere o elaborare tutte le informazioni contemporaneamente: la struttura dei dati offre tutta la precisione richiesta . Il collo di bottiglia non è dal lato della struttura dei dati, ma piuttosto dal lato del "consumatore" che vuole ottenere le informazioni da esso.
Andrej Bauer,

@AndrejBauer Ma in alcuni casi è necessario accedere o elaborare tutte le informazioni contemporaneamente, ad esempio questo è ciò che fa il calcolo simbolico, catturando l'essenza o la natura di una quantità piuttosto che qualsiasi altro flusso di cifre. Se si dice a un pacchetto di calcolo simbolico di verificare che , emetterebbe immediatamente vero. Se hai usato il metodo che sembra descrivere, prendendo le primekcifre della radice quadrata di2, perognikconcluderai che22=2k2 kpoiché il tuo risultato sarà (per qualsiasikfinito) uguale a1,99 ..., risposta errata. I calcoli sono limitati. 222k1.99...
Thomas,

2
@Thomas: il calcolo simbolico non rappresenta numeri reali, ma di solito alcuni sottocampi dei reali, in genere quello generato da funzioni elementari e radici di polinomi. Questi sottocampi non sono completi (chiusi sotto i limiti delle sequenze di Cauchy) né computabilmente completi (chiusi sotto i limiti calcolabili delle sequenze di Cauchy). Una rappresentazione non è una rappresentazione di reali a meno che non sia possibile rappresentare tutti i reali (calcolabili): e i calcoli simbolici non soddisfano questa condizione.
Andrej Bauer,

1
Queste osservazioni sulla numerabilità sono irrilevanti perché i reali calcolabili non sono calcolabili calcolabili.
Andrej Bauer,

7

Esistono molte implementazioni efficaci del numero razionale, ma una che è stata proposta molte volte e può persino gestire abbastanza bene alcune irrazionali è Frazioni continue .

Citazione da Continued Fractions di Darren C. Collins :

Teorema 5-1. - L'espressione della frazione continua di un numero reale è limitata se e solo se il numero reale è razionale.

Citazione da Mathworld - Frazioni continue periodiche

... una frazione continua è periodica se è la radice di un polinomio quadratico.

cioè tutte le radici possono essere espresse come frazioni continue periodiche.

C'è anche una frazione continua esatta per π che mi ha sorpreso fino a quando @AndrejBauer ha sottolineato che in realtà non lo è.


ππ

La rappresentazione delle frazioni continue di reali è stata proposta come implementazione per l'aritmetica reale esatta qualche tempo fa da J. Vuillemin. Si scopre che non è molto efficiente poiché i numeri diventano piuttosto grandi abbastanza presto, ed è difficile ridurne le dimensioni.
Andrej Bauer,

Le frazioni continue hanno alcuni problemi computazionali anche per la rappresentazione di numeri razionali - mentre possono essere confrontate relativamente rapidamente usando una variante dell'ordine lessicografico e mentre manipolare una singola frazione continua è facile, sia l'aggiunta (binaria) che la moltiplicazione su CF sono operazioni abbastanza complicate da strumento.
Steven Stadnicki,

5

Ci sono un certo numero di suggerimenti "esatti reali" nei commenti (ad esempio frazioni continue, trasformazioni frazionarie lineari, ecc.). Il problema tipico è che mentre è possibile calcolare le risposte a una formula, l'uguaglianza è spesso indecidibile.

Tuttavia, se sei solo interessato ai numeri algebrici, allora sei fortunato: la teoria dei campi reali chiusi è completa, o-minima e decidibile. Ciò è stato dimostrato da Tarski nel 1948.

Ma c'è un problema. Non vuoi usare l'algoritmo di Tarski, poiché è nella classe di complessità NONELEMENTARY, che è tanto impraticabile quanto gli algoritmi impraticabili possono ottenere. Esistono metodi più recenti che riducono la complessità a DEXP, che è il migliore che conosciamo attualmente.

Si noti che il problema è NP-difficile perché include SAT. Tuttavia, non è noto (o creduto) di essere in NP.

EDIT Proverò a spiegarlo un po 'di più.

Il framework per comprendere tutto ciò è un problema decisionale noto come Soddisfacente Modulo Teorie, o in breve SMT. Fondamentalmente, vogliamo risolvere il SAT per una teoria costruita sulla base della logica classica.

Quindi iniziamo con la logica classica del primo ordine con un test di uguaglianza. Quali simboli di funzione vogliamo includere e quali sono i loro assiomi determinano se la teoria è decidibile o meno.

Ci sono molte teorie interessanti espresse nel quadro SMT. Ad esempio, ci sono teorie sulle strutture di dati (ad esempio elenchi, alberi binari, ecc.) Che vengono utilizzate per aiutare a dimostrare i programmi corretti e la teoria della geometria euclidea. Ma per il nostro scopo, stiamo esaminando le teorie di diversi tipi di numero.

L'aritmetica di Presburger è la teoria dei numeri naturali con aggiunta. Questa teoria è decidibile.

L'aritmetica di Peano è la teoria dei numeri naturali con addizione e moltiplicazione. Questa teoria non è decidibile, come è stato dimostrato da Gödel.

L'aritmetica di Tarski è la teoria dei numeri reali con tutte le operazioni sul campo (addizione, sottrazione, moltiplicazione e divisione). È interessante notare che questa teoria è decidibile. Questo era un risultato altamente controintuitivo al momento. Potresti supporre che, poiché è un "superset" dei numeri naturali, è "più difficile", ma non è così; confrontare la programmazione lineare sui razionali con la programmazione lineare sugli interi, per esempio.

Potrebbe non sembrare ovvio che la soddisfazione sia tutto ciò di cui hai bisogno, ma lo è. Ad esempio, se si desidera verificare se la radice quadrata positiva di 2 è uguale alla radice cubica reale di 3, è possibile esprimere questo come problema di soddisfacibilità:

x.x>0x22=0x33=0

ex

sin{xπ|sinx=0}sin

exeix


Alfred Tarski (1948), un metodo decisionale per l'algebra e la geometria elementari .


2

È possibile rappresentare esattamente una grande classe di numeri chiamati numeri algebrici , trattandoli come radici di polinomi.

πe


eeixsincos{xR|sinx=0}

@Pseudonym Questo sembra davvero interessante, ma non credo di avere il background matematico per capirlo correttamente ... Cosa intendi con "abbastanza vicino agli interi"?
Altri assi

Ho intenzione di modificare la mia risposta per spiegare.
Pseudonimo,

1

π2


Questa risposta è falsa C'è un'intera area dell'aritmetica reale esatta che spiega come rappresentare i reali dai computer. L'ipotesi che un reale debba essere rappresentato da una stringa finita è errata. Possiamo anche usare stringhe infinite. Già Alan Turing ha scritto di questo nel suo primo articolo, quello in cui ha inventato le macchine Turing!
Andrej Bauer,

Puoi collegarti a un documento su come archiviare e manipolare le stringhe infinate in un computer reale, perché sarebbe la risposta a ciò che la domanda ha posto. Inoltre non era il suo primo articolo, la prima pubblicazione era il 1936, quel documento era il 1937.
Pianta

Hai ragione è il giornale del 1937. Per vedere come vengono manipolate le stringhe infinite, ad esempio puoi guardare il protocollo TCP / IP. Non ho mai detto che tutto il reale deve essere archiviato nel computer.
Andrej Bauer,

-1

Non puoi rappresentare tutti i numeri reali in un computer, ma puoi rappresentarne molti. Potresti usare le frazioni che rappresenterebbero più numeri dei float. Potresti anche fare cose più sofisticate come rappresentare i numeri come radice di alcuni polinomi con un'approssimazione che con il metodo Newton converge nel numero.


Questa è di nuovo una risposta falsa, prodotta dall'ignoranza. C'è un'intera area dell'aritmetica reale esatta che studia come rappresentare tutti i reali con adeguate strutture dati.
Andrej Bauer,

@AndrejBauer Quindi stai suggerendo che esiste una struttura di dati che può rappresentare qualsiasi numero reale? Qualsiasi struttura di dati di questo tipo dovrebbe usare una quantità infinita infinita di bit per rappresentare qualsiasi numero.
Alice Ryhl,

1
Una quantità numerabile di bit è sufficiente, prima di tutto, e poiché non sono necessari tutti contemporaneamente, né è possibile elaborarli tutti in una volta, è possibile memorizzarli nel tempo e nello spazio.
Andrej Bauer,

@AndrejBauer Questa risposta è corretta e dice la stessa cosa della tua, anche se con molte meno informazioni. Non puoi rappresentare tutti i numeri reali in un computer. Puoi rappresentare qualsiasi numero reale, ma non tutto in una volta. Semmai, contesterei il fatto che tu possa rappresentare "molti", dal momento che puoi rappresentare finitamente molti in un dato computer, e quasi nessuno (in senso matematico) in un computer astratto che equivale ai soliti modelli di calcolo (Turing macchina equivalente).
Gilles 'SO- smetti di essere cattivo' il

-1

È possibile rappresentare qualsiasi numero in modo preciso in cui gli input sono rappresentabili memorizzandoli come una serie di operazioni in modo che, ad esempio, si memorizzi 1/3come 1 divided by 3, gestendo l'annullamento delle operazioni è possibile semplificare l'operazione successiva per fornire una risposta esatta (1/3) * 3. Questo può anche gestire situazioni in cui hai conosciuto irrazionali come πconservandolo nei tuoi calcoli.

Tuttavia, richiede una quantità crescente di memoria per ogni numero e - supponendo che il tuo semplificatore non sia perfetto - probabilmente richiederà una quantità sempre crescente di valori su cui stai lavorando molto.


5+262=3

Infatti. In effetti, è probabilmente impossibile automatizzare completamente con successo. Tuttavia, il risultato rimane preciso anche se non hai utilizzato la rappresentazione più semplice possibile.
Jack Aidley,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.