Masques d'exception des opérations à virgule flottante
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>
</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
- Exception de virgule flottante : division par 0, domaine ou dépassement de capacité
- Exception de virgule flottante : perte de précision partielle ou débordement inférieur
- Exception de virgule flottante : erreur de pile
Voir aussi
- Exceptions de virgule flottante
- System.Math.SetExceptionMask
- System.Math.GetExceptionMask
- Problèmes d'arrondi des nombres à virgule flottante
- Exceptions (Delphi)
- ↑ 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,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,0 et 3,1 Ce comportement provoque un bogue car les architectures macOS x64 et Arm64 doivent avoir un comportement identique.