2013-06-01 7 views
20

So Haskell ha tipi di dati nativi, che permettono di avere davvero grandi numeri interi in modo da cose comeNumeri in virgola mobile ad alta precisione in Haskell?

>> let x = 131242358045284502395482305 
>> x 
131242358045284502395482305 

funzionano come previsto. Mi chiedevo se ci fosse un simile struttura "galleggiante di grandi dimensioni di precisione" nativo potrei utilizzerò, quindi le cose come

>> let x = 5.0000000000000000000000001 
>> x 
5.0000000000000000000000001 

potrebbe essere possibile. Se inserisco questo in Haskell, esso tronca fino a 5 se passo oltre 15 posizioni decimali (doppia precisione).

+1

Bene, c'è sempre 'Rational' in' Data.Ratio' per le frazioni di precisione abrogate. Ma generalmente, la risposta dipende da quali operazioni sono necessarie per supportare. – Vitus

+0

Suppongo che ['Rational'] (http://hackage.haskell.org/packages/archive/base/latest/doc/html/Prelude.html#t:Rational) non sia adatto ai tuoi scopi, ovvero hai bisogno del Istanza 'Floating'? – leftaroundabout

+2

Per la massima precisione possibile: http://www.haskell.org/haskellwiki/Exact_real_arithmetic (l'implementazione di AERN non ha funzionato per un po 'sebbene ... Non so se ci sono altri candidati in questo momento) – luqui

risposta

16

A seconda di quello che stai cercando:

  • Float e Double - più o meno ciò che sai e "amore" da float e double in tutte le altre lingue.
  • Rational che è una Ratio di Integer s
  • FixedPoint - Questo pacchetto fornisce valori del punto fisso arbitrari dimensioni. Ad esempio, se si desidera un numero rappresentato da 64 bit interi e 64 bit frazionali, è possibile utilizzare FixedPoint6464. Se si desidera un numero composto da 1024 bit interi e 8 bit frazionari, utilizzare $(mkFixedPoint 1024 8) per generare il tipo FixedPoint1024_8.
  • EDIT: E sì, ho appena saputo del pacchetto numbers sopra menzionato - molto interessante.
+1

C'è anche [Data.Fixed] (http://www.haskell.org/ghc/docs/latest/html/libraries/base/Data-Fixed.html) in 'base'. – hammar

+4

C'è anche una libreria per [numeri ciclotomici] (http://hackage.haskell.org/package/cyclotomic) che sono ancora esatti, includono tutti i razionali e altro, e hanno più predicati decidibili rispetto ai real calcolabili. –

7

Haskell non ha numeri in virgola mobile ad alta precisione in modo ingenuo.

Per un pacchetto/modulo/libreria a questo scopo, fare riferimento a this answer to another post. C'è anche un esempio che mostra come usare questo pacchetto, chiamato numbers.

+1

Non sono sicuro che questo pacchetto soddisfi esattamente le tue esigenze. Basta dare un'occhiata. ;) –

+0

Dai anche un'occhiata al [pacchetto hmpfr] (http://hackage.haskell.org/package/hmpfr). – vinc17

0

Se avete bisogno di un alta precisione/veloce/calcoli in virgola mobile, potrebbe essere necessario utilizzare FFI e long double, come il tipo di Haskell nativa non è ancora implementata (vedi https://ghc.haskell.org/trac/ghc/ticket/3353).