Préserver la précision dans les calculs de grands nombres en PHP
PHP peut rencontrer des problèmes de précision lors de l'exécution de calculs sur des entiers extrêmement grands. Cela peut devenir problématique lors de l'utilisation de techniques telles que l'exponentiation modulaire, comme dans le test de primalité de Fermat.
L'énigme du flotteur
La multiplication de deux grands entiers peut donner une valeur qui est automatiquement converti en float en PHP. Cela peut conduire à des calculs de module incorrects, comme démontré ci-dessous :
$x = 62574 * 62574; var_dump($x); // float(3915505476) ... correct var_dump($x % 104659); // int(-72945) ... incorrect
Une solution
PHP propose deux bibliothèques externes pour gérer les grands nombres : BC Math et GMP. GMP fournit une API plus complète, garantissant la précision même pour des valeurs exceptionnellement grandes.
Utilisation de GMP
GMP peut être utilisé pour représenter des nombres de précision arbitraires. Comme le montre la réponse fournie, des classes personnalisées telles que Decimal2 peuvent être créées pour faciliter les calculs de grands nombres et fournir des fonctionnalités telles que l'arrondi et le calcul de module.
// Using the GMP library $bignum = gmp_init('62574'); // Initialize GMP number $product = gmp_mul($bignum, $bignum); // Multiply using GMP $modulus = gmp_mod($product, 104659); // Calculate modulus using GMP echo gmp_strval($modulus); // Output the correct modulus value
Cette méthode garantit le calcul et la gestion des grands nombres avec les éléments nécessaires. précision, évitant toute perte potentielle de précision.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!