Che cosa ottieni quando attraversi un numero a precisione multipla con un numero a virgola mobile?

4

Sto lavorando per aggiungere interi multiprecisione alla suite di tipi numerici nel mio interprete APL , ma io Non sono sicuro di cosa fare riguardo alle strane combinazioni di tipi che ora si presentano. Ora ho i seguenti tipi:

IMM "atomic" small integer
FIX full-width integer
FLO floating-point double
MPI multi-precision integer

Ho una variabile che controlla quale tipo più grande usare per l'overflow dei numeri interi, FLO o MPI. Le operazioni miste MPI / IMM / FIX, poiché sono tutti numeri interi, possono semplicemente promuovere il tipo più largo e produrre un risultato di quel tipo. E le operazioni miste FLO / IMM / FIX possono seguire lo stesso schema poiché una doppia può comodamente ospitare tutti i valori di un numero intero a 32 bit. Questo copre la maggior parte dei casi. Ma mi lascia con queste combinazioni di tipi che non hanno una regola evidente (per me) da seguire.

FLO {+-*/} MPI
MPI {+-*/} FLO

Dopo averlo scritto, suppongo che ci sia davvero una soluzione ovvia (virgola mobile a più precisione). Ma non voglio farlo adesso. C'è una scorciatoia sensata che posso prendere (per ora)?

Come scenario di "caso peggiore" che offre almeno un qualche tipo di risultato, posso implementare conversioni tra questi due tipi. Ma c'è una potenziale perdita di dati a ogni modo.

FLO -> MPI loses fractional part of floating-point number
MPI -> FLO loses precision from integer
    
posta luser droog 28.04.2015 - 07:52
fonte

2 risposte

1

Un'altra opzione è aggiungere un tipo di numero razionale. Questo è memorizzato come due numeri interi, che di solito devono essere multi-precisione e possono rappresentare qualsiasi valore in virgola mobile compreso il risultato di un'operazione tra virgola mobile e un intero multi-precisione.

In questo modo non c'è perdita di informazioni. Ma c'è molto lavoro da fare e dovrebbe essere fatto solo se l'utente lo desidera.

    
risposta data 28.04.2015 - 21:55
fonte
1

Come inizio, se iniziamo a considerare le quantità effettive coinvolte, alcune sottocasi potrebbero essere gestite facilmente. Potrebbe anche dipendere dall'operazione che vogliamo fare.

MPI {+-} FLO
FLO {+-} MPI

Se l'FLO ha una parte frazionaria nulla, allora può essere convertito in MPI senza perdita di dati. Se ha una frazione, probabilmente vorremmo mantenere la frazione e dovremmo convertire l'MPI in FLO e far fronte alla perdita di precisione in qualche modo.

MPI * FLO
FLO * MPI

Ora qui, potremmo voler eseguire un'operazione di ridimensionamento sull'MPI, quindi forse un po 'di algebra può farci perdere un risultato.

FLO = int + (1/frac)
R = MPI * FLO
  = MPI * (int + (1/frac))
  = (MPI * int) + (MPI/frac)

Tutto ciò sembra portare a un parametro configurabile dall'utente che seleziona il tipo da produrre.

O se l'MPI è esattamente rappresentabile come un doppio, allora può essere convertito senza paura. Sebbene il risultato possa perdere precisione se i valori sono vicini ai limiti di rappresentazione.

    
risposta data 28.04.2015 - 08:39
fonte

Leggi altre domande sui tag