#include
#include
int main()
{
double a,b,c,d,x,x1,x2;
scanf("%lf %lf %lf",&a,&b,&c);
d=b*b-4*a*c;
if(a==0)
{
if(b!=0)
{
if((-c)/b!=-0) printf("x = %g",(-c)/b);
else if((-c)/b==-0) printf("x = 0");
else printf("x = %g",(-c)/b);
}
else if(b==0&&c!=0) printf("无解");
else if(b==0&&c==0) printf("无穷多解");
}
else if(a!=0)
{
if(d>=0)
{
x1=(-b+sqrt(d))/(2*a);x2=(-b-sqrt(d))/(2*a);
if(x1==x2)
{
x1=(-b)/(2*a);
if(x1==0) printf("x1 = x2 = 0");
else printf("x1 = x2 = %g",x1);
}
else if(x1!=x2)
{
if(x1==0) printf("x1 = 0, x2 = %g",x2);
else if(x2==0) printf("x1 = %g, x2 = 0",x1);
else printf("x1 = %g, x2 = %g",x1,x2);
}
}
else if(d<0)
{
x1=(-b)/(2*a); x2=fabs(sqrt(-d)/(2*a));
if(x1==0)
{
printf("x1 = %g+%gi, x2 = %g-%gi",0,x2,0,x2);
}
else printf("x1 = %g+%gi, x2 = %g-%gi",x1,x2,x1,x2);
}
}
return 0;
}
最后那个怎么做出来都是x1=0.2, x2=0.2
if(x1==x2)不合适,改为 if(fabs(x1-x2) < 1e-6) 浮点数最好不要直接判断相等,由于误差可能会不相等,应该计算两者差值的绝对值小于一个很小数来判定相等
不知道你这个问题是否已经解决, 如果还没有解决的话:接下来我们先聊聊单精度浮点数,32bit位是按照下图所示的3段来存储的:
以上面的10.3为例,用二进制表示为1010.0100110011001100110011001……,
前面是手动计算的结果,我们可以用一个C语言的联合体来验证下计算结果是否正确,首先定义了一个联合体的数据类型包含2个成员,一个是32bit长度的无符号整型,一个是单精度浮点型,赋值其中的浮点类型,再用16进制的方法打印其无符号整型值,可以方便观察二进制数值:
//juzicode.com / VX:桔子code //vs2015
#include "stdio.h"
typedef union {
unsigned int i;
float f;
}fu32;
int main(void)
{
fu32 fu1;
fu1.f = 10.3f;
printf("fu1.f=%f\n", fu1.f);
printf("fu1.i=0x%x\n", fu1.i);
return 0;
}
-----运行结果:
fu1.f=10.300000
fu1.i=0x4124cccd
这里得到的结果为0x4124cccd,和前面手动计算的结果是一样的。
下面再来看一个负数的浮点数-0.2,用乘2取整的方法计算其二进制形式:
最后得到的小数为-0.001100110011001100110011001100110011……,
同样可以用联合体的方式打印其十六进制数值进行验证:
//juzicode.com / VX:桔子code //vs2015
#include "stdio.h"
typedef union {
unsigned int i;
float f;
}fu32;
int main(void)
{
fu32 fu1;
fu1.f = -0.2f;
printf("fu1.f=%f\n", fu1.f);
printf("fu1.i=0x%x\n", fu1.i);
return 0;
}
-----运行结果:
fu1.f=-0.200000
fu1.i=0xbe4ccccd