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.