Masques d'exception des opérations à virgule flottante

De RAD Studio

A partir de RAD Studio Athens (R120), tous les masques d'exception associés à la virgule flottante seront activés. Par défaut, les applications ne déclencheront plus d'exceptions de virgule flottante sur aucune plate-forme.

Le comportement par défaut de la RTL Delphi consiste à désactiver toutes les exceptions de virgule flottante.

Plate-forme Nom de la variable de contrôle dans System Depuis 11.3 Après 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

Tableau des anciens et des nouveaux comportements

Plate-forme Type de programme Ancien comportement Nouveau comportement
1/0 sqrt (-1) 1/0 sqrt (-1)
Win/x32

Win/x64

Par défaut / Console / VCL Exception EZeroDivide [1]

Le résultat n'est pas défini.

Exception EInvalidOp [1]

Le résultat n'est pas défini.

Aucune exception

Le résultat est Inf

Aucune exception

Le résultat est NAN

Win/x32

Win/x64

FMX Aucune exception[2]

Le résultat est Inf

Aucune exception[2]

Le résultat est NAN

Aucune exception

Le résultat est Inf

Aucune exception

NAN

macOS/x64 FMX/Console Aucune exception

Le résultat est Inf

Exception EInvalidOp

Le résultat n'est pas défini.

Aucune exception

Le résultat est Inf

Aucune exception

Le résultat est NAN

macOS/Arm64 FMX/Console Aucune exception

Le résultat est Inf

Aucune exception[3]

Le résultat est NAN

Aucune exception

Le résultat est Inf

Aucune exception

Le résultat est NAN

iOS/Arm64 FMX Aucune exception

Le résultat est Inf

Exception EInvalidOp

Le résultat n'est pas défini.

Aucune exception

Le résultat est Inf

Aucune exception

Le résultat est NAN

iOS-Sim/Arm64 FMX Aucune exception

Le résultat est Inf

Exception EInvalidOp

Le résultat n'est pas défini.

Aucune exception

Le résultat est Inf

Aucune exception

Le résultat est NAN

Android/Arm32 FMX Aucune exception

Le résultat est Inf

Exception EInvalidOp

Le résultat n'est pas défini.

Aucune exception

Le résultat est Inf

Aucune exception

Le résultat est NAN

Android/Arm64 FMX Aucune exception

Le résultat est Inf

Exception EInvalidOp

Le résultat n'est pas défini.

Aucune exception

Le résultat est Inf

Aucune exception

Le résultat est NAN

Linux/x64 Console Aucune exception

Le résultat est Inf

Exception EInvalidOp

Le résultat n'est pas défini.

Aucune exception

Le résultat est Inf

Aucune exception

Le résultat est NAN

<références>

[1] [2] [3]

</références>

Comment restaurer l'ancien comportement

Si vous voulez revenir à l'ancien comportement pour les exceptions, appelez SetExceptionMask dans System.Math avec les options suivantes dans le bloc de code source principal de l'application (généralement un fichier .DPR)

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

Par exemple :

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;.

Rubriques

Voir aussi

  1. 1,0 1,1 et 1,2 Dépend des unités/composants utilisés. Si l'application utilise OpenGL, toutes les exceptions sont masquées.
  2. 2,0 2,1 et 2,2 Toutes les exceptions sont déjà désactivées. System.Win.InternetExplorer masque toutes les exceptions et FMX.Platform.Win, une unité fondamentale, l'utilise.
  3. 3,0 et 3,1 Ce comportement provoque un bogue car les architectures macOS x64 et Arm64 doivent avoir un comportement identique.