2015-08-06 2 views
0

Un vérificateur (de type double) array est obtenu à partir d'un gsl_vector de la manière suivante.Double comparaison en C

for (i=0; i<M; i++) 
{    
    checker[i] = (double)gsl_vector_get(check, i); 
    printf(" %f", checker[i]); 
} 

matrice vérificateur a [ 3.000000 -3.000000 -11.000000 -5.000000 ] éléments après l'opération ci-dessus (à partir de la sortie du programme ci-dessus).

Je suis confronté à un problème étrange maintenant.

for (i=0; i<M; i++) 
{ 
    printf("checker: %f\n", checker[i]);   
    if(checker[0] == 3.00) 
    {   
     printf("Inside If: %f\n", checker[i]);   
    } 
} 

Les sorties de code ci-dessus

checker: 3.000000 
checker: -3.000000 
checker: -11.000000 
checker: -5.000000 

Comme on le voit, la boucle à l'intérieur de iffor ne sont pas exécutées. Quel pourrait être le problème?

Modifier: Le problème ci-dessus est allé directement quand je copiais [ 3.000000 -3.000000 -11.000000 -5.000000 ] dans le tableau de vérificateur au lieu du gsl_vector_get(check,i). La valeur de vérification provient de la fonction dgmev où une matrice et un vecteur sont multipliés.

Merci

+1

J'espère que le dupe va résoudre votre problème, sinon, s'il vous plaît revenir. Je vous remercie. –

+0

Note: vous avez aussi une faute de frappe - votre condition 'if' vérifie' checker [0] 'au lieu de' checker [i] '. –

+0

@ michel-slm: Ce n'était pas une faute de frappe, je vérifiais juste le premier élément. – re3el

Répondre

2

Un nombre à virgule flottante peut-être représenté sous la forme suivante:

[signe] [mantisse] * 2 [exposant]

Il y aura clôturerons ou des erreurs relatives lorsque l'espace est moins en mémoire.

De wiki:

simple précision format à virgule flottante est un format numérique par ordinateur qui occupe 4 octets (32 bits) dans la mémoire de l'ordinateur et représente une large plage dynamique de valeurs en utilisant une variable point.

enter image description here

La norme IEEE 754 spécifie un binary32 comme ayant:

Sign bit: 1 bit 
Exponent width: 8 bits 
Significand precision: 24 bits (23 explicitly stored) 

Cela donne de 6 à 9 chiffres décimaux significatifs de précision (si une chaîne décimale avec au la plupart des 6 décimales significatives sont converties en IEEE 754 simple précision puis reconverties au même nombre de décimal significatif, la chaîne finale doit correspondre à l'original; et si une seule précision IEEE 754 est convertie en une chaîne décimale avec au moins 9 décimales significatives, puis reconvertie en simple, , le nombre final doit correspondre à l'original [4]).

représentations à virgule flottante plus grande taille (plusieurs bits) permettent une plus grande précision.

mathématiques à virgule flottante est pas exact. Les valeurs simples comme 0,1 ne peuvent pas être représentées avec précision en utilisant des nombres à virgule flottante binaires, et la précision limitée des nombres à virgule flottante signifie que de légères modifications dans l'ordre des opérations peuvent modifier le résultat. A lire:

What Every Computer Scientist Should Know About Floating-Point Arithmetic

La norme IEEE divise les exceptions en 5 classes: débordement, sousverse, division par zéro, opération non valide et inexacte. Il existe un indicateur d'état distinct pour chaque classe d'exception. La signification des trois premières exceptions est évidente. L'opération invalide couvre les situations listées dans le TABLEAU D-3, et toute comparaison impliquant un NaN.