2010-11-25 5 views
2
float jk = 7700; float ck = 8000; - if i do int jk; I get rim=0; 

printf (asin(jk/10500)) = 1.57897 - for example 
printf (asin(ck/9500)) = 0.87868 - for example 

float rim; 
rim= asin(jk/10500)+ asin(ck/9500); 

printf("\n%f", rim) = nan 

Pourquoi je reçois nan?float + float = NAN

+2

J'ai reçu une sortie correcte (ou au moins valide), est-ce votre code actuel? Et je suis asin (0.5) = 0.5235 ... – Vladimir

+1

La seconde valeur est 0.8 sur votre machine ?? Courez-vous ceci sur Windows? : P – Bourne

+0

@Alexei, vous devez poster le code _actual_. Comme tout le monde l'a dit, ça semble fonctionner (d'accord sur d'autres plateformes). – paxdiablo

Répondre

4

Je ne crois pas votre "par exemple". Parce que je ne crois pas à la magie. Si vous avez deux flottants valides tous les deux assez petits, alors leur somme n'est pas un nan. Donc, ma conjecture est la suivante:

soit |jk| > 10500 ou |ck| > 9500. Donc vous faites un asin avec un argument invalide (> 1.0 ou < -1.0) et obtenez ainsi un nan.

Ou vous avez fait une autre erreur. Veuillez publier un exemple exécutable compilable qui affichera NAN

4

Il y a quelque chose qui ne va pas dans votre code ou quelque chose qui ne va pas avec l'iPhone. Le code suivant:

#include<stdio.h> 
#include<math.h> 
int main (void) { 
    printf ("%f\n", asin(1)); 
    printf ("%f\n", asin(0.5)); 
    float rim; 
    rim = asin(1) + asin (0.5); 
    printf ("%f\n", rim); 
    return 0; 
} 

produit un plus sensible:

1.570796 
0.523599 
2.094395 

En d'autres termes, à la fois votre asin(0.5) et votre somme sont incorrects.

Etes-vous sûr que vous ne l'avez pas fait quelque chose comme:

rim = asin(1 + asin (0.5)); 

Ce sera en effet vous donner NaN.


mise à jour en fonction de votre information ajoutée:

Votre code fonctionne toujours très bien dans mon environnement:

#include<stdio.h> 
#include<math.h> 
int main (void) { 
    float jk = 7700; 
    //jk = 7700/10500; 
    jk = jk/10500; 
    printf ("%f\n", asin(jk)); 
    float hg = 8000; 
    hg = hg/9500; 
    printf ("%f\n", asin(hg)); 
    float rim; 
    rim = asin(jk) + asin (hg); 
    printf ("%f\n", rim); 
    return 0; 
} 

délivrer en sortie:

0.823212 
1.001175 
1.824387 

Vous remarquerez que je changé jk = 7700/10500 à jk = jk/10500 puisque ce dernier vous a donné 0 en raison de l'entier divisio n, mais je n'ai pas NaN dans les deux cas. Vous devez vraiment poster un programme complet qui montre le comportement errant.

+0

Post Édité avec le code réel –

3
#include <stdio.h> 
#include <math.h> 

main() 
{ 
float jk=7700, ck=8000; 
printf ("\n%f",asin(jk/10500)); 
printf ("\n%f",asin(ck/9500)); 

float rim; 
rim= asin(jk/10500)+ asin(ck/9500); 

printf("\n%f", rim);// = nan 
} 

Sortie

0.823212 
1.001175 
1.824387 
2

Je pense que votre code est bon. Le problème est la valeur de jk et ck.

Vous savez si | jk/temp |> 1 ou | ck/temp |> 1, le retour de asin (jk/temp) sera nan.

alors essayez de faire | jk/temp | < = 1 et | ck/temp | < = 1, je crois que le retour sera ok.