/*------------------------------*/
|
/*
|
Titre : Fractionne en PHP 1 nombre en dividende et quotient
|
|
Date édition : 14 Fev 2019
|
Date mise a jour : 19 Aout 2019
|
|
Rapport de la maj:
|
- fonctionnement du code vérifié
|
*/
|
/*------------------------------*/
|
|
function fraction($real){
|
$real = abs($real);
|
$retour = array();
|
$ent = floor($real);
|
|
global $garde_fou_de_l_appel_recursif_de_fraction;
|
$garde_fou_de_l_appel_recursif_de_fraction++;
|
// cette variable sert a interrompre l'appel recursif
|
// au cas ou on descendrait trop bas dans les
|
// nombres representables par PHP
|
// ce nom horrible est destine a eviter les collisions
|
// avec d'autres.
|
|
if ( $garde_fou_de_l_appel_recursif_de_fraction == 10){
|
$garde_fou_de_l_appel_recursif_de_fraction--;
|
return array("quot" => 0, "div" => 1);
|
// Normalement, cette valeur attenue les erreurs
|
// liees a la divergence de l'algorithme
|
}
|
$real -= $ent;
|
// en cas de bouclage infini, on peut reduire la severite du test ici
|
// ||||||
|
if (abs(floor(1/$real) - 1/$real) < 1.0e-9){
|
// le nombre est de la forme 1/X
|
$retour['quot'] = intval(1/$real);
|
$retour['div'] = 1 + $ent*$retour['quot'];
|
asort($retour);
|
// cet appel est un confort :
|
// comme cela, le tableau se presente sous la forme :
|
// dividande/diviseur
|
$garde_fou_de_l_appel_recursif_de_fraction--;
|
return $retour;
|
}
|
|
// le nombre est de la forme Y/X
|
// donc appel recursif
|
$r = fraction(1/$real);
|
$retour['div'] = $r['quot'] + $r['div']*$ent;
|
$retour['quot'] = $r['div'];
|
$garde_fou_de_l_appel_recursif_de_fraction--;
|
return $retour;
|
|
}
|
| ?> |