2010-10-22 23 views
5

Sto tentando di emulare un generatore di report mainframe (non più esistente) in un ambiente Access 2003 o Access 2010. I dati che genera devono corrispondere esattamente ai rapporti cartacei dei primi anni '70. Sfortunatamente, i dati dei primi anni sono stati eseguiti su hardware che utilizzava la rappresentazione in virgola mobile IBM anziché IEEE. Con l'aiuto di Google, ho trovato una libreria di funzioni VBA che convertirà un float dal decimale al formato binario IEEE 754 a 32 bit. Ho dovuto modificare la libreria per accettare flottanti a 32 o 64 bit, quindi ho una conoscenza modesta dei formati a virgola mobile, tuttavia, ho problemi a effettuare la conversione da IEEE al formato binario IBM, oltre a problemi di moltiplicazione e aggiunta i numeri IBM o IEEE.Emulazione moltiplicazione/aggiunta virgola mobile IBM in VBA

Non ho trovato altre librerie per eseguire questa conversione e operazioni aritmetiche in VBA: c'è un modo più semplice per farlo, o una libreria esistente che non trovo? In caso contrario, una spiegazione chiara e diretta degli algoritmi rilevanti?

Grazie in anticipo.

+0

Sei sicuro che il report sull'IBM utilizzato a virgola mobile? La maggior parte di questo genere di cose utilizzava il BCD. – Gabe

+0

Non sono sicuro al 100% - questa determinazione era basata su un collega che ricorda un programmatore di mainframe che spiegava anni fa che il motivo per cui non possiamo abbinare i dati più vecchi è dovuto a "cambiamenti nel modo in cui il compilatore gestisce le posizioni decimali", e documentazione che SAS ha aggiunto il supporto per IEEE in virgola mobile a fianco di IBM in virgola mobile un paio di anni prima di smettere di vedere le incongruenze. –

+0

Il formato BCD non era un formato a virgola mobile O non nel mondo dei mini-computer IBM S/34, S/36 e S/38 nei tardi anni '70 e '80. http://en.wikipedia.org/wiki/Binary-coded_decimal –

risposta

1

Il problema è qui confondendo il problema del tipo decimale in accesso e quello dei valori in virgola mobile di tipo singolo e doppio disponibili in accesso.

Se si utilizza il tipo di dati di valuta in accesso, questo è un numero intero in scala e non produce arrotondamenti (questo è ciò che la maggior parte di noi utilizza per calcoli e report finanziari). Puoi anche usare valori decimali in accesso, e di nuovo non arrotondano affatto perché sono imballati in decimali.

Tuttavia, sia i valori singoli sia quelli double disponibili all'interno dell'accesso sono in effetti dello stesso formato e sono conformi allo standard IEEE in virgola mobile.

Per una singola variabile di accesso, questo è un numero a 32 bit, e la gamma è:

-3.402823E38 
    to 
-1.401298E-45 for negative values 

e

1.401298E-45 
    to 
3.402823E38 for positive values 

Questo sembra essere lo stesso per me come lo standard IEEE 754.

Pertanto, se si sommano i valori dell'accesso come singolo, è necessario ottenere gli stessi risultati.

Quindi, Intel basato e accesso singolo e doppio credo siano gli stessi di questo standard IEEE.

L'unico vero problema e qui è qual è il formato dei dati originali che si stanno inserendo in accesso e quali tipi di testo o stringa o processo di conversione si verificano quando tali dati vengono estratti e memorizzati?

L'accesso può convertire i numeri. Provate a digitare questi valori al prompt dei comandi di accesso (finestra di debug)

? hex(255) 
    Above will show FF 

? csng(&hFF) 
    Above will show 255 

Edit:

Ah, ok, lo vedi ora ho questo invertito, il mio male qui. Il problema qui è che, supponendo che si converta un numero nel vecchio formato IBM (Excess 64?), Si dovrà quindi mettere le mani sul proprio codice che hanno usato per aggiungere quei numeri. Infatti, anche allora, diversi modelli IBM a seconda di ciò che hai acquistato produceva effettivamente risultati diversi (più soldi = più precisione).

Quindi, non solo avete bisogno di routine di conversione per convertire la rappresentazione interna, quindi avete bisogno delle routine che aggiungono/sottraggono/moltiplicano quei numeri. Quindi, avere solo routine di conversione non ti porterà molto lontano, dal momento che devi anche duplicare le loro routine esatte che fanno matematica. Questi tipi di routine probabilmente non sono tutti uguali in termini di numeri arrotondati, ecc.

+0

Non penso che sia il caso di confondermi con single/double in Access. So che sono entrambi dello stesso formato. Il problema è che ho bisogno di abbinare i numeri che sono stati generati da un sistema che ha * non * utilizzato il formato IEEE 754. I numeri che entrano in Access sono in formato di testo a virgola fissa (123.456, ad esempio, sempre con 3 posizioni decimali). La difficoltà è che ci sono calcoli che moltiplicano tre di questi # e poi ne aggiungono migliaia - ho bisogno di emulare gli errori di precisione che si sono verificati sull'hardware/software originale. –

+0

Ah, sì, ho letto male. Vedi la mia modifica + ulteriori commenti qui. Penso che la conversione in formato IBM potrebbe non essere troppo difficile, ma questa è solo una piccola parte del problema. Scoprire la precisione interna è facile, ma scoprire come funzionano le routine matematiche e come hanno gestito l'arrotondamento sarà molto più difficile qui. –

2

Per essere onesti, probabilmente sarebbe meglio iniziare osservando l'emulatore di Hercules. http://www.hercules-390.org/ Oltre a quello in teoria con VBA, è possibile utilizzare il tipo Decimal per ottenere buoni risultati (nota che è necessario CDec per crearli) utilizza 12 bit con una potenza variabile di dieci scalari.

Un google rapido mostra this post dal gruppo Ercole, che conferma il punto Alberts circa la necessità di conoscere l'hardware:

--- Snip--

In teoria, ma piuttosto meno nella pratica. S/360 e S/370 avevano una scelta di set di istruzioni scientifiche o commerciali. Il primo ha aggiunto le istruzioni FP e si registra alla base; il secondo le istruzioni decimali , tra cui Modifica e modifica & Mark. Ma i modelli più grandi 360 (iirc/65 e superiore) e 370 (/ 155 e successivi) avevano l'unione dei due, chiamato il set di istruzioni Universali, e ad un certo punto l'S/370 lasciò cadere l'opzione .

--- --- snip

devo dire che dopo aver guardato il codice sorgente hercules avrete probabilmente bisogno di capire esattamente quali codici operativi in ​​virgola mobile (in termini di precisione singola, lunga, esteso) vengono eseguiti.