2014-07-22 18 views
5

Ora, numeri fluttuanti e precisione doppia, sebbene possano approssimare qualsiasi tipo di numero (sebbene lo stesso si possa dire interi, i float sono solo più precisi), sono rappresentati come decimali binari internamente . Ad esempio, un decimo sarebbe approssimataCome estrarre la frazione diadica dal galleggiante

0.00011001100110011... (... only goes to computers precision, not infinity) 

Ora, qualsiasi numero in binario con i bit finito come qualcosa che si chiama un dyadic fraction rappresentazione in matematica (non ha nulla a che fare con la p-adica). Ciò significa che lo rappresenti come una frazione, in cui il denominatore è un potere di 2. Ad esempio, diciamo che il nostro computer si approssima di un decimo come 0,00011. La frazione diadica per questo è 3/32 o 3/(2^5), che è vicino a un decimo. Ora per la mia domanda tecnica. Quale sarebbe il modo più semplice per estrarre la frazione diadica da un numero mobile.

Nota irrilevante: se ti stai chiedendo perché vorrei farlo, è perché sto creando una libreria di numeri surreali in Haskell. Le frazioni diadiche sono facilmente traducibili in numeri surreali, motivo per cui è conveniente che il binario sia facilmente tradotto in diadica, (comunque avrò problemi con i numeri razionali)

+1

+1 per una libreria di numeri surreali per Haskell. –

+0

Sarebbe solo Surreals tale che i set left e right sono numerabili. – PyRulez

+0

Probabilmente solo quelli in cui gli insiemi di sinistra e di destra sono enumerabili, ma dovrebbe essere sufficiente per chiunque. :) –

risposta

5

La funzione decodeFloat sembra utile per questo. Tecnicamente, dovresti anche controllare che floatRadix sia 2, ma per quanto posso vedere questo è sempre il caso in GHC.

Basta fare attenzione poiché non semplifica la mantissa e l'esponente. Qui, se valuto decodeFloat (1.0 :: Double) ottengo un esponente di -52 e una mantissa di 2^52 che non è quello che mi aspettavo.

Inoltre, toRational sembra generare una frazione diadica. Non sono sicuro che sia sempre così, però.

+0

Bene, tutti i valori in virgola mobile IEEE-754 * sono frazioni diadiche. Quindi se toRational è sempre esatto, allora il risultato sarà. – Carl

+0

Sì, toRational è esatto. – augustss

Problemi correlati