This commit is contained in:
2026-09-13 10:20:16 +02:00
parent 019c8ad335
commit b72193d656
38 changed files with 1523 additions and 837 deletions

View File

@@ -2,100 +2,102 @@
> Document compagnon. Les exemples illustrent les règles du chapitre ; la formulation normative reste dans le chapitre lui-même.
## Exemples extraits du chapitre
### Exemple 1
```text
conversion de valeur
cast de hiérarchie nominale
bitcast de représentation binaire
```
### Exemple 2
## Conversion explicite
```text
int8 small = ...;
int32 large = small; // ERROR
int32 large = small; // ERROR
int32 explicitLarge = small::toInt32(); // OK
```
### Exemple 3
## Widening total
```text
Dog dog = ...;
Animal animal = dog;
Serializable serializable = dog;
int8 value = ...;
int32 larger = value::toInt32();
```
### Exemple 4
Aucun `tryToInt32()` parallèle n'est nécessaire si toutes les valeurs source sont exactement représentables.
## Narrowing exact avec `Fault`
```text
Animal animal = ...;
if (animal is Dog) {
// animal est raffiné en Dog ici.
}
int32 value = ...;
int8 smaller = value::toInt8();
```
### Exemple 5
La signature Core peut déclarer :
```text
toTarget()
conversion exacte et totale
tryToTarget()
conversion exacte pour la valeur courante, récupérable si impossible
roundToTarget()
perte de précision explicitement acceptée, conversion totale
tryRoundToTarget()
perte de précision explicitement acceptée, mais conversion pouvant échouer
saturateToTarget()
saturation explicite lorsqu'aucun arrondi supplémentaire n'est nécessaire
saturatingRoundToTarget()
arrondi + saturation explicitement annoncés
wrapToTarget()
wrapping entier explicite
toInt8() -> int8
faults NumericConversionFault
```
### Exemple 6
`OutOfRange` est produit lorsque la valeur ne tient pas dans `int8`.
## Politiques distinctes
```text
tryToIntXX()
tryToUintXX()
value::toInt8() // exact, peut fault
value::saturateToInt8()
value::wrapToInt8()
```
### Exemple 7
Ces opérations coexistent seulement lorsque leur résultat peut réellement différer.
## Flottant vers entier
```text
floor()
ceil()
round()
truncate()
float64 value = ...;
int32 exact = value::toInt32();
```
### Exemple 8
La conversion exige une valeur finie, intégrale et dans la plage.
Pour choisir explicitement une politique mathématique :
```text
value::floor()::tryToInt32()
value::ceil()::tryToInt32()
value::round()::tryToInt32()
value::truncate()::tryToInt32()
value::floor()::toInt32()
value::ceil()::toInt32()
value::round()::toInt32()
value::truncate()::toInt32()
```
### Exemple 9
Pour choisir la politique de plage :
```text
value::floor()::trySaturateToInt32()
value::round()::tryWrapToInt32()
value::floor()::saturateToInt32()
value::round()::wrapToInt32()
```
### Exemple 10
## Entier vers flottant
```text
int64 value = ...;
float64 exact = value::toFloat64();
float64 approximated = value::roundToFloat64();
```
`toFloat64()` exige l'exactitude ; `roundToFloat64()` accepte explicitement la perte de précision.
## Flottant vers flottant
```text
toFloatXX()
exige l'exactitude
roundToFloatXX()
accepte l'arrondi canonique
peut fault OutOfRange sur une valeur finie
saturatingRoundToFloatXX()
accepte l'arrondi canonique
sature une valeur finie hors domaine
```
Les catégories suivantes sont préservées :
```text
NaN -> NaN
@@ -105,31 +107,13 @@ NaN -> NaN
-0 -> -0
```
### Exemple 11
## `NumericConversionFault`
```text
payload NaN
quiet/signaling bit
signe du NaN
représentation binaire exacte
NumericConversionFault extends Fault
```
### Exemple 12
```text
tryToFloatXX()
exige une représentation exacte
tryRoundToFloatXX()
accepte l'arrondi canonique
refuse une valeur finie hors domaine fini destination
saturatingRoundToFloatXX()
accepte l'arrondi canonique
sature une valeur finie hors domaine vers +/-Target::Max
```
### Exemple 13
Codes :
```text
NotFinite
@@ -138,40 +122,10 @@ OutOfRange
Inexact
```
### Exemple 14
DON'T : introduire mécaniquement :
```text
NotFinite
NaN ou +/-Infinity lorsqu'une valeur finie est requise
NotIntegral
float -> integer alors que la valeur n'est pas mathématiquement entière
OutOfRange
valeur mathématique hors du domaine de la destination
Inexact
valeur dans le domaine destination mais non représentable exactement
alors que l'opération exige l'exactitude
tryToTarget() -> Result<Target,NumericConversionError>
```
### Exemple 15
```text
sourceType
targetType
sourceValue
timestamp
backend
roundingMode
```
### Exemple 16
```text
annexes/A-numeric-conversions.md
```
## DO / DON'T / WHY / compiler error / edge cases
À consolider progressivement avant la baseline publique V3 et à transformer, lorsque pertinent, en tests de conformité de la toolchain.
si cette méthode ne ferait que dupliquer `toTarget() faults NumericConversionFault`.