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
为什么我会得到楠?
答案 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,我相信回报会没问题。