Le programme C n’ajoute pas correctement float

J’ai une méthode qui ressemble à ceci:

float * mutate(float* organism){ int i; float sign = 1; static float newOrg[INPUTS] = {0}; for (i = 0;i<INPUTS;i++){ if (rand() % 2 == 0) { sign = 1; } else { sign = -1; } float temp = (organism[i] + sign); printf("bf: %f af: %f diff: %f sign: %f sign2: %f temp: %f\n\n", organism[i], (organism[i] + sign), (organism[i] + sign)-organism[i], sign, sign+sign, temp); newOrg[i] = organism[i] + sign; } return newOrg; } 

Lorsque sign n’est pas égal à 0, les deux premiers "%f" sont identiques et le 3ème est égal à 0, le fait de placer la sum dans une variable n’a pas aidé. Cela me déconcerte! Je peux poster le code complet si nécessaire.

Sortie:

 bf: 117810016.000000 af: 117810016.000000 diff: 0.000000 sign: 1.000000 sign2: 2.000000 temp: 117810016.000000 

Précision finie du float .

Un float typique ne peut représenter que 2 32 nombres différents environ. 117 810 016,0 et 1,0 en sont deux. 117 810 017,0 n’est pas. Ainsi, la sum C de 117810016.0 + 1.0 donne la “meilleure” réponse de 117810016.0 .

Utiliser un type de précision plus élevé, comme double , étendra souvent la plage de +1 mathématiques exactes, mais même avec des valeurs suffisamment grandes, ce ne sera pas exact (généralement environ 9,0 * 10e 15 ou 2 53 ).

Si le code doit être conservé avec float , suggérez de limiter l’ organism[i] aux valeurs comsockets dans la plage ou ± 8 388 608,0 (2 23 ).

Peut-être que le code peut simplement utiliser des types entiers pour cette tâche comme long long .