float + float = NAN - PullRequest
       11

float + float = NAN

2 голосов
/ 25 ноября 2010
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

Почему я получаю Нэн?

Ответы [ 4 ]

4 голосов
/ 25 ноября 2010

Что-то не так с вашим кодом или что-то не так с iphone. Следующий код:

#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;
}

производит более разумное:

1.570796
0.523599
2.094395

Другими словами, и ваша asin(0.5), и ваша сумма неверны.

Вы уверены, что на самом деле не делали что-то вроде:

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

Это действительно даст вам NaN.


Обновление на основе добавленной вами информации:

Ваш код все еще отлично работает в моей среде:

#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;
}

Вывод:

0.823212
1.001175
1.824387

Вы заметите, что я изменил jk = 7700/10500 на jk = jk/10500, так как последний дал 0 из-за целочисленного деления, но я не получаю NaN ни в одном случае. Вам действительно нужно опубликовать complete программу, которая показывает ошибочное поведение.

4 голосов
/ 25 ноября 2010

Я не верю твоему "например".Потому что я не верю в магию.Если у вас есть два действительных числа с плавающей запятой, оба довольно маленькие, то их сумма не равна нан.Итак, я думаю, это:

или |jk| > 10500 или |ck| > 9500.Таким образом, вы делаете asin с недопустимым (> 1.0 или <-1.0) аргументом и таким образом получаете nan. </p>

Или вы сделали другую ошибкуПожалуйста, опубликуйте скомпилированный исполняемый пример, который напечатает NAN

3 голосов
/ 25 ноября 2010
#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
}

Выход

0.823212
1.001175
1.824387
2 голосов
/ 21 марта 2011

Я думаю, что ваш код правильный.Проблема в значениях jk и ck.

Вы знаете, если | jk / temp |> 1 или | ck / temp |> 1, возвращение asin (jk / temp) будет равно nan.

, поэтому попробуйте сделать | jk / temp | <= 1 и | ck / temp |<= 1, я верю, что возвращение будет в порядке. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...