Dernière version : 1.0.0-bêta
Bibliothèque PHP 5.3+ pour les opérations arithmétiques sur les entiers qui s'enroule en cas de débordement.
Attention
Cette bibliothèque n'est pas destinée à être utilisée pour effectuer correctement des opérations arithmétiques sur des nombres entiers et ne doit pas être utilisée à la place des opérateurs arithmétiques natifs ou de toute autre bibliothèque conçue à cet effet.
Contrairement à d'autres langages qui débordent de grands entiers positifs en grands entiers négatifs, PHP déborde en réalité d'entiers en nombres à virgule flottante. Dans la plupart des cas, les débordements arithmétiques doivent être traités comme une circonstance inhabituelle nécessitant un traitement spécial. Cependant, il existe certains cas où un tel comportement de bouclage est réellement utile - par exemple avec les numéros de séquence TCP ou certains algorithmes, tels que le calcul de hachage. Cette classe utilitaire fournit des fonctions arithmétiques de base qui fonctionnent conformément à ce comportement.
Pour illustrer, considérons l’exemple suivant :
// Output on 64-bit system: float(9.2233720368548E+18)
var_dump ( PHP_MAX_INT + 1 );
// Output on 64-bit system: int(-9223372036854775808)
var_dump (IntMath:: add ( PHP_MAX_INT , 1 ));
Comme indiqué précédemment, l'ajout d'un au plus grand entier pris en charge à l'aide des opérateurs arithmétiques natifs entraînera un nombre à virgule flottante. En revanche, l'utilisation de IntMath::add() provoquera un débordement, entraînant le plus petit entier pris en charge dans cette version de PHP.
L'API est largement documentée dans le code source. De plus, une version HTML est également disponible pour une visualisation plus pratique dans le navigateur.
Utilisez Composer pour installer le package :
$ composer require phpcommon/intmath
Actuellement, seules les quatre opérations arithmétiques de base (addition, soustraction, multiplication et division) et la négation sont prises en charge.
Pour les valeurs entières, la négation équivaut à la soustraction à zéro. Étant donné que PHP utilise une représentation en complément à deux pour les entiers et que la plage des valeurs du complément à deux n'est pas symétrique, la négation de l'entier négatif maximum entraîne ce même nombre négatif maximum. Même si un débordement s'est produit, aucune exception n'est levée.
Pour toutes les valeurs entières $a
, -$a
est égal à (~$a) + 1
.
Exemple d'utilisation de l'API :
// Outputs int(-100)
var_dump (IntMath:: negate ( 100 ));
Le résultat de l'addition de deux entiers correspond aux bits de poids faible du véritable résultat mathématique, représenté dans un format de complément à deux suffisamment large. En cas de débordement, le signe du résultat peut ne pas être le même que le signe de la somme mathématique des deux valeurs. Malgré le débordement, aucune exception n’est levée dans ce cas.
Exemple d'utilisation de l'API :
// Outputs int(300)
var_dump (IntMath:: add ( 100 , 200 ));
La soustraction d’un nombre positif donne le même résultat que l’addition d’un nombre négatif de même grandeur. De plus, la soustraction à zéro équivaut à la négation. Le résultat est constitué des bits de poids faible du véritable résultat mathématique représenté dans un format de complément à deux suffisamment large. En cas de débordement, le signe du résultat peut ne pas être le même que le signe de la différence mathématique des deux valeurs. Malgré le débordement, aucune exception n’est levée dans ce cas.
Exemple d'utilisation de l'API :
// Outputs int(90)
IntMath:: subtract ( 100 , 10 );
Le résultat de la multiplication de deux nombres entiers correspond aux bits de poids faible du véritable résultat mathématique, représenté dans un format de complément à deux suffisamment large. En cas de débordement, le signe du résultat peut alors ne pas être le même que le signe du produit mathématique des deux valeurs. Malgré le débordement, aucune exception n’est levée dans ce cas.
Exemple d'utilisation de l'API :
// Outputs int(200)
IntMath:: multiply ( 100 , 2 );
La division arrondit le résultat vers zéro. Ainsi la valeur absolue du résultat est le plus grand entier possible inférieur ou égal à la valeur absolue du quotient des deux opérandes. Le résultat est nul ou positif lorsque les deux opérandes ont le même signe et zéro ou négatif lorsque les deux opérandes ont des signes opposés.
Il existe un cas particulier qui ne satisfait pas à cette règle : si le dividende est l'entier négatif de plus grande ampleur possible pour son type et que le diviseur est -1
, alors un débordement d'entier se produit et le résultat est égal au dividende. Malgré le débordement, aucune exception n’est levée dans ce cas. D'un autre côté, si la valeur du diviseur dans une division entière est 0
, alors une DivisionByZeroException
est levée.
Exemple d'utilisation de l'API :
// Outputs int(50)
IntMath:: divide ( 100 , 2 );
Veuillez consulter CHANGELOG pour plus d'informations sur ce qui a changé récemment.
$ composer test
Consultez la documentation des tests pour plus de détails.
Les contributions au package sont toujours les bienvenues !
Veuillez consulter CONTRIBUTION et CONDUITE pour plus de détails.
Si vous découvrez des problèmes liés à la sécurité, veuillez envoyer un e-mail à [email protected] au lieu d'utiliser le suivi des problèmes.
Tout le contenu de ce package est sous licence MIT.