System.TExtended80Rec
Delphi
TExtended80Rec = packed record
private
{$IFDEF EXTENDEDIS10BYTES}
aExtended80: Extended;
{$ELSE !EXTENDEDIS10BYTES}
aExtended80Frac: UInt64;
aExtended80Exp: UInt16;
{$ENDIF !EXTENDEDIS10BYTES}
function InternalGetBytes(Index: Cardinal): UInt8; inline;
function InternalGetWords(Index: Cardinal): UInt16; inline;
procedure InternalSetBytes(Index: Cardinal; const Value: UInt8); inline;
procedure InternalSetWords(Index: Cardinal; const Value: UInt16); inline;
function GetBytes(Index: Cardinal): UInt8;
function GetWords(Index: Cardinal): UInt16;
function Get_Exp: UInt64; inline;
function GetExp: UInt64; inline;
function GetFrac: UInt64; inline;
function GetSign: Boolean; inline;
procedure SetBytes(Index: Cardinal; const Value: UInt8);
procedure SetWords(Index: Cardinal; const Value: UInt16);
procedure Set_Exp(NewExp: UInt64); inline;
procedure SetExp(NewExp: UInt64);
procedure SetFrac(NewFrac: UInt64); inline;
procedure SetSign(NewSign: Boolean);
public
function Exponent: Integer;
function Fraction: Extended;
function Mantissa: UInt64; inline;
property Sign: Boolean read GetSign write SetSign;
property Exp: UInt64 read GetExp write SetExp;
property _Exp: UInt64 read Get_Exp write Set_Exp;
property Frac: UInt64 read GetFrac write SetFrac;
function SpecialType: TFloatSpecial;
procedure BuildUp(const SignFlag: Boolean; const Mantissa: UInt64; const Exponent: Integer);
class operator Explicit(a: Extended): TExtended80Rec;
class operator Explicit(a: TExtended80Rec): Extended;
property Bytes[Index: Cardinal]: UInt8 read GetBytes write SetBytes; // 0..9
property Words[Index: Cardinal]: UInt16 read GetWords write SetWords; // 0..4
end;
C++
struct DECLSPEC_DRECORD TExtended80Rec
{
private:
#ifndef _WIN64
Extended aExtended80;
#else /* _WIN64 */
unsigned __int64 aExtended80Frac;
Word aExtended80Exp;
#endif /* _WIN64 */
Byte __fastcall InternalGetBytes(unsigned Index);
Word __fastcall InternalGetWords(unsigned Index);
void __fastcall InternalSetBytes(unsigned Index, const Byte Value);
void __fastcall InternalSetWords(unsigned Index, const Word Value);
Byte __fastcall GetBytes(unsigned Index);
Word __fastcall GetWords(unsigned Index);
unsigned __int64 __fastcall Get_Exp(void);
unsigned __int64 __fastcall GetExp(void);
unsigned __int64 __fastcall GetFrac(void);
bool __fastcall GetSign(void);
void __fastcall SetBytes(unsigned Index, const Byte Value);
void __fastcall SetWords(unsigned Index, const Word Value);
void __fastcall Set_Exp(unsigned __int64 NewExp);
void __fastcall SetExp(unsigned __int64 NewExp);
void __fastcall SetFrac(unsigned __int64 NewFrac);
void __fastcall SetSign(bool NewSign);
public:
int __fastcall Exponent(void);
Extended __fastcall Fraction(void);
unsigned __int64 __fastcall Mantissa(void);
__property bool Sign = {read=GetSign, write=SetSign};
__property unsigned __int64 Exp = {read=GetExp, write=SetExp};
__property unsigned __int64 _Exp = {read=Get_Exp, write=Set_Exp};
__property unsigned __int64 Frac = {read=GetFrac, write=SetFrac};
TFloatSpecial __fastcall SpecialType(void);
void __fastcall BuildUp(const bool SignFlag, const unsigned __int64 Mantissa, const int Exponent);
static TExtended80Rec __fastcall _op_Explicit(Extended a);
__property Byte Bytes[unsigned Index] = {read=GetBytes, write=SetBytes};
__property Word Words[unsigned Index] = {read=GetWords, write=SetWords};
};
Propriétés
Type | Visibilité | Source | Unité | Parent |
---|---|---|---|---|
record struct |
public | System.pas System.hpp |
System | System |
Description
Fournit la prise en charge pour la manipulation des valeurs à virgule flottante en précision étendue.
Un TExtended80Rec peut être utilisé pour effectuer des opérations de bas niveau sur une valeur à virgule flottante en précision étendue. Par exemple, le signe, l'exposant et la mantisse peuvent être changés séparément.
Dans Delphi sur Win32, le type de données Extended est de 10 octets. Toutefois, sur Win64, le type de données Extended est seulement de 8 octets. L'utilisation de TExtended80Rec sur Win64 vous permet d'effectuer des opérations associées à la mémoire avec des variables à virgule flottante sur 10 bits, mais pas des opérations arithmétiques en précision étendue.
Remarque :
- Pour manipuler un type de données à virgule flottante en précision étendue sur 80 bits, il est recommandé d'utiliser TExtendedHelper. Toutefois, TExtended80Rec n'est pas obsolète, et il est possible d'utiliser TExtended80Rec pour allouer des données Extended sur 80 bits.
- Depuis XE3, les propriétés TExtended80Rec.Bytes et TExtended80Rec.Words sont des propriétés tableau. Les opérateurs System.High et System.Low ne s'appliquent pas aux propriétés tableau. Vous pouvez utiliser à la place System.SizeOf, comme illustré dans l'exemple de TSingleRec.
Exemple
var
F: TExtended80Rec;
E: Extended;
I: Integer;
const
TAB = Chr(9);
begin
F := TExtended80Rec(-66.3);
Writeln('Sign: ' + TAB + TAB + IntToStr(Integer(F.Sign)));
Writeln('Exponent: ' + TAB + IntToStr(Integer(F.Exp)));
Writeln('Mantissa: ' + TAB + IntToHex(UInt64(F.Mantissa), 16));
// Subtract 1 from exponent
// This is equivalent with division by 2
F.Exp := F.Exp - 1;
E := Extended(F);
Writeln('Size of Extended: ' + TAB + IntToStr(SizeOf(E))); // displays 10 on Win32 and 8 on Win64
Writeln(FloatToStr(E)); // displays -33.15 (-66.3 / 2)
// ...
Sortie console si la taille de Extended est de 10 octets :
Sign: 1 Exponent: 16389 Mantissa: 849999999999999A Size of Extended: 10 -33.15
Sortie console si la taille de Extended est de 8 octets :
Sign: 1 Exponent: 16389 Mantissa: 8499999999999800 Size of Extended: 8 -33.15
La constante à virgule flottante "-66.3" est évaluée en précision 64 bits si la taille du type Extended est de 80 bits. Mais si la taille de Extended est de 64 bits, "-66.3" est évaluée seulement en précision 53 bits même si TExtended80Rec peut gérer les 64 bits. Cela explique pourquoi la mantisse et la fraction ont une différence.