float + float = NAN

时间:2010-11-25 12:12:01

标签: iphone c object

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 个答案:

答案 0 :(得分:4)

我不相信你的“例如”。因为我不相信魔法。如果你有两个非常小的有效浮点数,那么它们的总和不是一个南。所以,我猜是这样的:

|jk| > 10500|ck| > 9500。因此,您使用无效(> 1.0或< -1.0)参数生成asin,从而得到一个nan。

或者你又犯了一个错误。请发布一个可编辑的可运行示例,该示例将打印NAN

答案 1 :(得分:4)

你的代码有问题或者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。你真的需要发布一个完整的程序来显示错误的行为。

答案 2 :(得分: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
}

<强>输出

0.823212
1.001175
1.824387

答案 3 :(得分:2)

我认为你的代码是对的。问题是jk和ck的价值。

你知道如果| jk / temp |&gt; 1或| ck / temp |&gt; 1,asin(jk / temp)的返回值将为nan。

所以尝试使| jk / temp |&lt; = 1和| ck / temp | &lt; = 1,我相信回报会没问题。