浮動小数点オペレーションの例外マスク

提供: RAD Studio
移動先: 案内検索

RAD Studio Athens(R120)より、浮動小数点関連の例外マスクがすべてオンになります。 デフォルトでは、アプリケーションはすべてのプラットフォームで浮動小数点例外を発生させなくなります。

Delphi RTL のデフォルトの設定では、すべての浮動小数点関連の例外は無効化されています。

プラットフォーム System でのコントロール変数名 11.3 以降 12.0 以降
Win/x32 Default8087CW $1332 $033F
Win/x64 DefaultMXCSR $1900 $1F80
macOS/x64 DefaultFPEnv $0032 $003F
macOS/Arm64 DefaultFPSCR $0000_0700 $0000_0000
iOS/Arm64 DefaultFPSCR $0000_0700 $0000_0000
iOS-Sim/Arm64 DefaultFPSCR $0000_0700 $0000_0000
Android/Arm32 DefaultFPSCR $0000_0700 $0000_0000
Android/Arm64 DefaultFPSCR $0000_0700 $0000_0000
Linux/x64 DefaultFPEnv $0032 $003F

新旧での動作の一覧

プラットフォーム プログラムの種類 旧動作 新動作
1/0 sqrt (-1) 1/0 sqrt (-1)
Win/x32

Win/x64

デフォルト / コンソール / VCL EZeroDivide 例外 [1]

結果は未定義。

EInvalidOp 例外[1]

結果は未定義。

例外なし

結果は Inf

例外なし

結果は NAN

Win/x32

Win/x64

fmx 例外なし [2]

結果は Inf

例外なし [2]

結果は NAN

例外なし

結果は Inf

例外なし

NaN

macOS/x64 FMX/コンソール 例外なし

結果は Inf

EInvalidOp 例外

結果は未定義。

例外なし

結果は Inf

例外なし

結果は NAN

macOS/Arm64 FMX/コンソール 例外なし

結果は Inf

例外なし [3]

結果は NAN

例外なし

結果は Inf

例外なし

結果は NAN

iOS/Arm64 fmx 例外なし

結果は Inf

EInvalidOp 例外

結果は未定義。

例外なし

結果は Inf

例外なし

結果は NAN

iOS-Sim/Arm64 fmx 例外なし

結果は Inf

EInvalidOp 例外

結果は未定義。

例外なし

結果は Inf

例外なし

結果は NAN

Android/Arm32 fmx 例外なし

結果は Inf

EInvalidOp 例外

結果は未定義。

例外なし

結果は Inf

例外なし

結果は NAN

Android/Arm64 fmx 例外なし

結果は Inf

EInvalidOp 例外

結果は未定義。

例外なし

結果は Inf

例外なし

結果は NAN

Linux/x64 コンソール 例外なし

結果は Inf

EInvalidOp 例外

結果は未定義。

例外なし

結果は Inf

例外なし

結果は NAN

<references>

[1] [2] [3]

</references>

以前の動作に復元するには

例外の動作を以前のものに戻したい場合は、System.Math の SetExceptionMask を次のオプションを付けて、アプリケーションのメイン ソース ブロックに対して呼び出します(通常、DPR ファイル)。

System.math.SetExceptionMask( [exPrecision, exUnderflow, exDenormalized]); // Enable exInvalidOp, exZeroDivide, and exOverflow exceptions

例:

uses
  System.Math, // Add System.Math unit
  <span class="glossaryTerm">Vcl<span class="tooltip"><p>Visual Component Library</p></span></span>.Forms,
  Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
begin
  System.math.SetExceptionMask( [exPrecision, exUnderflow, exDenormalized]); // Add this line.
  Application.Initialize;.

トピック

関連項目

  • 1.0 1.1 1.2 どのユニット/コンポーネントが使用されるかによって変わります。もしアプリケーションが OpenGL を使用する場合、アプリケーションはすべての例外をマスクします。
  • 2.0 2.1 2.2 すべての例外がすでに無効化されています。System.Win.InternetExplorer はすべての例外をマスクします。基本的な FMX.Platform.Win はこのユニットを使用します。
  • 3.0 3.1 この結果はバグです! x64 と Arm64 の両方の macOS は同じ動作でなければなりません。