一个简单的c语言程序,输出-1.#IND00..不知道哪里错

#include <stdio.h>
#include <math.h>
void main() {//输入一元二次方程的系数a,b,c,输出解x1,x2;
double a,b,c,q,x,y;
printf("请输入一元二次方程ax2+bx+c=0的系数abc,用逗号隔开\n");
scanf("a%lf,b%lf,c%lf",&a,&b,&c);
q = sqrt(b*b-4*a*c);
x = (-b-q)/(2*a);
y = (-b+q)/(2*a);
printf("解为x1=%lf,x2=%lf\n",x,y);
}
我在网上查了资料,说是可能原因1.除数为0,2.数据溢出
应该不是原因1吧,如果是数据溢出的话,能不能解释一下什么是数据溢出呢?

进行浮点数编程时,如果没有注意,常常会出现输出类似 1.#IND, 1.#INF 或者 nan, inf 之类奇怪的输出。这通常隐含了浮点数操作的异常。

特殊浮点数的含义

1.#INF / inf:这个值表示“无穷大 (infinity 的缩写)”,即超出了计算机可以表示的浮点数的最大范围(或者说超过了 double 类型的最大值)。例如,当用 0 除一个整数时便会得到一个1.#INF / inf值;相应的,如果用 0 除一个负整数也会得到 -1.#INF / -inf 值。

-1.#IND / nan:这个的情况更复杂,一般来说,它们来自于任何未定义结果(非法)的浮点数运算。"IND"是 indeterminate 的缩写,而"nan"是 not a number 的缩写。产生这个值的常见例子有:对负数开平方,对负数取对数,0.0/0.0,0.0*∞, ∞/∞ 等。

简而言之,如果遇到 1.#INF / inf,就检查是否发生了运算结果溢出除零,而遇到 1.#IND / nan,就检查是否发生了非法的运算。

特殊浮点数的判断

很多 C 库都提供了一组函数用来判断一个浮点数是否是无穷大或 NaN。int _isnan(double x) 函数用来判断一个浮点数是否是 NaN,而 int _finite(double x) 用以判断一个浮点数是否是无穷大。

你可能已经注意到了,上面两个函数都是以下划线开头的,因此在可移植性上可能是存在问题的,那么如何实现一个通用的判断版本呢?首先,对于 Nan,可以用下面的代码实现:

bool IsNumber(double x)
{
// 这里的比较操作看上去总是会得到 true
// 但有趣的是对于 IEEE 754 浮点数 NaN 来说总会得到 false!
return (x == x);
}
而下面的代码可以判断一个浮点数是否是有限的(finite, 即既不是 NaN 又不是 infinite):

bool IsFiniteNumber(double x)
{
return (x <= DBL_MAX && x >= -DBL_MAX);
}
其中,DBL_MAX 是 <float.h> 中预定义的常量

把上面两个函数结合起来,还可以实现一个浮点数是否是 Inf 的判断。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-03-10
sqrt()的参数是负数的话,它会输出错误提示。
你输入的 a,b,c 三个值 进行 b*b-4*a*c 后可能是个负数。追问

我感到奇怪的就是,我输入的是1,2,1.还是出现这个1.#ind00..
好像输入任何数都是这个..
vc6下编译的..抓狂

第2个回答  2011-03-10
#include <stdio.h>
#include <math.h>
void main()
{
float a,b,c,d,q,p,x1,x2;
printf("请输入一元二次方程系数abc");
scanf("%f%f%f",&a,&b,&c);
q=sqrt(b*b-4*a*c);
p=-b/(2*a);
d=q/(2*a);
x1 =p-d;
x2 =p+d;
printf("x1=%f,x2=%f\n",x1,x2);
}可以了,弄半天哦追问

呃,我是定义的x和y当做x1和x2的啊
printf里面的x1和x2是输出的内容..

第3个回答  2011-03-10
当c=0是x=0,可能有数据溢出现象追问

但是我输入任何数值都出现错误啊..

追答

q = sqrt(b*b-4*a*c);
printf("1111\n");
x = (-b-q)/(2*a);
printf("2222\n");
y = (-b+q)/(2*a);
printf("3333\n");
你看屏幕上会显示什么?

追问

1111
2222
3333呃..

追答

printf("解为x1=%15.2f,x2=%15.2f\n",x,y);用这句试试,应该是这句话错了

追问

运行了还是不对,你用vc6试试,不会是我的编译软件坏了吧?

追答

你的报错信息写全给我看看

追问

完全不报错,但是运行的时候,结果为
解为x1=-1.#IND00,x2=-1.#IND00

第4个回答  2011-03-10
不懂
相似回答