2010-05-19 8 views
4

dans mon code j'ai deux valeurs doubles. Appelons les $a et $b. maintenant je veux tester dont l'un d'eux est plus grande, donc j'écrit ce qui suit:PHP: tester deux variables doubles donne un résultat différent sans changer les variables

print ($a > $b ? "larger\n" : "smaller\n"); 
print ($a > $b ? "larger\n" : "smaller\n"); 

étrangement le résultat est

larger 
smaller 

Quelqu'un a rencontré un problème similaire avant? Ce problème n'apparaît que sur notre système Linux embarqué utilisant php-cgi.

Merci pour vos réponses et conseils.

Voici le code tout: je dois décoder une valeur hexadécimale en une valeur décimale en ce qui concerne le signe et éventuellement un nombre useng plus grande que la taille entière

function decodeInteger($datahex) 
{ 
    // ignore non hex characters 
    $hex = preg_replace('/[^0-9A-Fa-f]/', '', $datahex); 

    // converted decimal value as double: 
    $dec = hexdec($hex) * 1.0; 

    // maximum decimal value based on length of hex + 1: 
    // number of bits in hex number is 8 bits for each 2 hex-characters -> max = 2^n 
    // use 'pow(2.0,n)' since '1 << n' and 'pow(2,n)' is only for integers and therefore limited to integer size. 
    $max = pow(2.0, 4 * (strlen($hex) + (strlen($hex) % 2))); 

    // complement = maximum - converted hex: 
    $_dec = $max - $dec; 


    print ($dec > $_dec ? "larger\n" : "smaller\n"); 
    print ($dec > $_dec ? "larger\n" : "smaller\n"); 

    // if dec value is larger than its complement we have a negative value (first bit is set) 
    return $dec > $_dec ? -$_dec : $dec; 
} 
+3

Quelle valeur passez-vous à la fonction pour obtenir les résultats contradictoires? – webbiedave

+0

'00000000', '00000fdf', '00000efa', etc. –

+0

Ma conjecture (et c'est une conjecture) est que vous perdez de la précision avec vos deux variables flottantes. –

Répondre

1

S'il vous plaît exécuter

var_dump($dec); var_dump($_dec); var_dump($dec); var_dump($_dec); 
print ($dec > $_dec ? "larger\n" : "smaller\n"); 

var_dump($dec); var_dump($_dec); var_dump($dec); var_dump($_dec); 
print ($dec > $_dec ? "larger\n" : "smaller\n"); 

et publiez la sortie ici. (désolé de l'afficher comme une réponse, mais ma réputation Stackoverflow ne permet pas encore de commentaires)