Domanda

Quindi conosco la precisione in virgola mobile (e come cose come 1.1 non possono essere espresse esattamente in binario) e tutto il resto, ma mi chiedo: come possono le librerie matematiche implementare una precisione infinita? In altre parole, come rappresenteresti, ad esempio, 1.1 accuratamente in binario? Solo una breve descrizione sarebbe fantastica, posso capire da solo i dettagli esatti. Grazie. :)

È stato utile?

Soluzione

Non esistono librerie di precisione infinite, ma esistono librerie di precisione arbitrarie. Per i dettagli su come implementarli, leggi alcuni documentazione :-)

Per rappresentare 1.1 esattamente in binario, il virgola mobile non può essere usato come indicato correttamente. Può essere rappresentato se si memorizza la parte integrale (1) come numero intero e la parte frazionaria (.1) come un altro numero intero, quindi è necessario creare la logica per gestire queste strutture. In alternativa, potrebbe essere memorizzato come una frazione (11/10) con sia il denominatore che il numeratore memorizzati come numeri interi.

Altri suggerimenti

Se intendi davvero una precisione infinita ci sono due opzioni:

  • Usa una qualche forma di calcolo pigro. Quindi puoi chiedere a un numero tutta la precisione che desideri " dopo " eseguendo il calcolo (dato che è pigro, in realtà lo ha fatto solo allora). Lo svantaggio è che questo è molto inefficiente. Puoi farlo in una lingua come Haskell usando uno speciale sistema numerico in cui le rappresentazioni si sovrappongono, ad es. base 2 con cifre -1, 0, 1. La rappresentazione abituale non è adatta, perché ad esempio 1 è necessaria una precisione infinita per decidere tra l'output 0 per 0.999 ... e 1 per 1.000 ...

  • Effettua calcoli simbolicamente. Rappresenta esattamente numeri interi, razionali, radici, ecc. Ciò è necessario se si desidera decidere sull'uguaglianza, ma anche piuttosto inefficiente e limitato a casi speciali.

Le librerie matematiche con infinito non sono implementate. Non si può fare. Il numero 1/3 non può essere rappresentato in un numero finito di bit diverso da come una frazione. Numeri trascendenti come pi ed e non possono essere rappresentati completamente in alcun modo.

D'altra parte, è possibile creare librerie matematiche con enorme precisione. Si tratta solo di assegnare abbastanza bit per la mantissa del valore in virgola mobile.

Esistono alcuni algoritmi geometrici che dipendono dall'aritmetica esatta, quindi se guardi nella libreria CGAL troverai una varietà di tipi numerici esatti che sono "chiusi". sotto varie operazioni. Cioè, non c'è modo di usare le operazioni supportate per produrre un risultato che non può essere rappresentato esattamente.

Alcuni esempi:

  • I numeri interi sono chiusi in aggiunta e moltiplicazione.

  • Anche le razionali sono chiuse sotto divisione, ad eccezione di un caso speciale per zero. Può essere rappresentato come una coppia di numeri interi. Vedi anche le funzioni numeriche razionali in GMP . ad es. 1.1 = 11/10, può essere rappresentato come (11, 10).

  • Un tipo di numero che è anche chiuso sotto radice quadrata.

Potresti anche rappresentare numeri in decimali e fare l'aritmetica decimale. La rappresentazione sottostante è binaria, nel senso che ogni cifra è rappresentata con un codice binario. Ogni cifra, a sinistra o a destra del punto decimale, viene considerata come un numero intero. L'aritmetica viene quindi eseguita `` manualmente '', cifra per cifra.

Un esempio di una libreria basata su decimali è BCMath in PHP.

Mentre Pax è totalmente qui quando parliamo di punti e numeri fluttuanti, credo che ci sia una soluzione ma è molto inefficiente.
Puoi utilizzare una stringa per rappresentare il tuo numero, le stringhe non perdono precisione.
Ogni volta che hai un numero come " 0.0001 " + "0,1" fai l'iterazione di entrambe le stringhe e converti solo la posizione corrente in un int.
Passaggio 1:
0 + 0 = 0 - > converti in stringa e assegna a dati [0].
Passaggio 2:
0 + 1 = 1 - > converti in stringa e assegna a dati [1].
Passaggio 3:
iter > "0,1" .lenght () - > fermare.

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