2012-02-03 13 views
66

FmtBcd.pas è stata ampiamente revisionata riscritta in Delphi XE2. In uno dei miei progetti, ho un caso che utilizza un'operazione di divisione su due valori Bcd, ma le due versioni danno risultati diversi. Nel peggiore dei casi, il Delphi XE2 potrebbe lanciare un Bcd overflow error.La funzione BcdDivide si comporta in modo diverso in Delphi XE e XE2

Esempio: L'esecuzione del seguente codice in Delphi XE2 applicazioni console:

var A, B, C, D: TBcd; 
begin 
    A := StrToBcd('1'); 
    B := StrToBcd('3'); 
    BcdDivide(A, B, C); 
    WriteLn(BcdToStr(C)); 

    try 
    BcdMultiply(C, C, D); 
    WriteLn(BcdToStr(D)); 
    except 
    on E: Exception do 
     WriteLn(E.Message); 
    end; 

    ReadLn; 
end. 

uscita di quanto sopra sarà:

0.333333333333333333333333333333333333333333333333333333333333333 
BCD overflow 

La variabile C contiene un valore BCD con 63 cifre decimali di specificità . L'esecuzione di una seconda operazione BcdMultiply sulla variabile C causerà un Bcd overflow error.

Tuttavia, per eseguire lo stesso codice in Delphi XE produce il seguente risultato senza alcun prompt di eccezione:

0.3333333333 
0.11111111108888888889 

Qualcuno potrebbe suggerire un metodo best-practice per risolvere questo problema?

+4

Difficile dire altro, tranne che si tratta di un bug in XE2. –

+8

Ho segnalato a http://qc.embarcadero.com/wc/qcmain.aspx?d=103106 –

+1

Stessi risultati quando compilato per Win32 o Win64? –

risposta

5

Il codice nella domanda produce l'output previsto nell'aggiornamento XE2 4. Si noti che l'aggiornamento 3 produce l'output non valido e quindi la correzione è arrivata con l'aggiornamento 4. Inoltre, XE3 produce l'output previsto.

Problemi correlati