System.SysUtils.TExtendedHelper

提供: Appmethod Libraries
移動先: 案内検索

Object Pascal

TExtendedHelper = record helper for Extended

C++

typedef void *TExtendedHelper;

プロパティ

種類 可視性 ソース ユニット
helper
typedef
public
System.SysUtils.pas
System.SysUtils.hpp
System.SysUtils System.SysUtils


説明

拡張精度(Extended 型)浮動小数点値に対する低レベル演算を実行できるようにします。

32 ビット Windows では、Extended 数値は 80 ビットで表されます: 1 ビットが Sign(符号)用、15 ビットが Exponent(指数)用、64 ビットが Fraction(少数)用です。 バイアスは 16383 です。

64 ビット Windows と ARM プラットフォームでは、Extended 型は Double のエイリアスです。Double 型実数(倍精度実数)は 64 ビットで表されます。つまり、符号部に 1 ビット、指数部に 11 ビット、小数部に 52 ビットです。バイアスは 1023 です。詳細については、「Extended 型の内部表現」を参照してください。

TExtendedHelper 型変数のすべてのビットに、符号部仮数部指数部で与えられた値を割り当てるには、BuildUp メソッドを使用します。

TExtendedHelper のメソッド ExponentFractionMantissa を使用すると、数値の構成要素に直接アクセスできます。

メモ: 32 ビット Windows では、TExtendedHelper は、これまで TExtended80Rec で提供されていたサポートを提供します。プログラムでは、すべてのプラットフォームで 80 ビット拡張精度浮動小数点型が依然として操作される場合、TExtended80Rec 型を使用できます。

var
  aNumber: Extended;

begin  
  aNumber := 28;

  Writeln(Format('Number: %f', [aNumber])) ;
  Writeln(Format('Exponent: %d', [aNumber.Exp]));
  Writeln(Format('Fraction: %x', [aNumber.Frac]));
  Writeln(Format('Mantissa: %x', [aNumber.Mantissa]));
ReadLn;

SizeOf(Extended) が 10 バイトの場合のコンソール出力:

Number: 28.00
Exponent: 16387
Fraction: E000000000000000
Mantissa: E000000000000000

SizeOf(Extended) が 8 バイトの場合のコンソール出力:

Number: 28.00
Exponent: 1027
Fraction: C000000000000
Mantissa: 1C000000000000

28 という数値は、2 進法では 11100 と表されます。正規化後は 1.1100 * 2^4 になります。

符号部は 0(False)です。

指数部 は 4 です。ただし、Extended のサイズが 10 バイトの場合(たとえば 32 ビット Windows プラットフォームなど)、指数部は拡張精度で 16383(バイアス)+ 4 = 16387 と表されます。16387 は 2 進法で 100000000000011 です。

Extended のサイズが 8 バイトの場合(たとえば 64 ビット Windows プラットフォームなど)、指数部は 1023(バイアス)+ 4 = 1027 と表されます。1027 は 2 進法で 10000000011 です。

Extended のサイズが 10 バイトの場合、小数部仮数部のすべてのビットを含んでおり、11100 に等しくなります。小数部は 64 ビットで表されるため、11100 の続きを 64 桁までゼロで埋めて
11100000000000000000000000000000000000000000000000000 となります(16 進法では $E000000000000000 です)。

Extended のサイズが 8 バイトの場合、小数部は小数点記号の後のビットのみから 2 進形式で構成され、1100 に等しくなります。つまり、先頭ビットの値 1 が省略されています。このようなプラットフォームでは、小数部は 52 ビットで表されるため、1100 の続きを 52 桁までゼロで埋めて
11000000000000000000000000000000000000000000000000000 となります(16 進法では $C000000000000 です)。

仮数部には、数値のすべての精度ビット 11100 が含まれています。

Extended のサイズが 10 バイトの場合、仮数部は 64 ビットで表されるため、11100 の続きを 64 桁までゼロで埋めて
11100000000000000000000000000000000000000000000000000 となります(16 進法では $E000000000000000 です)。

Extended のサイズが 8 バイトの場合、仮数部は 53 ビットで表されるため、11100 の続きを 53 桁までゼロで埋めて
11100000000000000000000000000000000000000000000000000 となります(16 進法では $1C000000000000 です)。

関連項目

コード例