求一元二次方程的根,为什么float型数据与0的比较时,无法进入if语句块调用求根的函数
#include <stdio.h>
#include <math.h>
float a , b , c , x1 , x2 , derta ;//存疑 无法判断derta与0的大小关系
int main(){
void value1(float a ,float b ,float c);
void value2(float a ,float b ,float c);
void value3(float a ,float b ,float c);
printf("请依次输入二次项,一次项和常数项的值,之间用空格分隔\n");
scanf("%f %f %f",&a , &b , &c);
derta = b * b - 4 *a * c;
if (derta > 0){
void value1(float a,float b,float c);
}
if (derta == 0){
void value2(float a,float b,float c);
}
if (derta < 0){
void value3(float a,float b,float c);
}
}
void value1(float a ,float b ,float c){
x1 = (-b + sqrt(derta)) / 2 * a;
x2 = (-b - sqrt(derta)) / 2 * a;
printf("方程的两个根分别为%f,%f",x1,x2);
}
void value2(float a ,float b ,float c){
x1 = -b / (2 * a);
x2 = -b / (2 * a);
printf("方程的两个根相同为%f",x1);
}
void value3(float a ,float b ,float c){
printf("方程没有实数根");
}
#include <stdio.h>
#include <math.h>
#define EPSILON 1e-6
float a , b , c , x1 , x2 , derta ;
int main(){
void value1(float a ,float b ,float c);//可以放在这里,也可以写在main外面,写在main外面的,到时候其他函数也可以直接调用。
void value2(float a ,float b ,float c);
void value3(float a ,float b ,float c);
printf("请依次输入二次项,一次项和常数项的值,之间用空格分隔\n");
scanf("%f %f %f",&a , &b , &c);
derta = b * b - 4 *a * c;
if (fabs(derta-0) <= EPSILON){//由于浮点数的精度问题,一般认为误差在一定的范围内即为相等
value2(a,b,c);//调用的方式是这种,而不是照搬上面的
}else if (derta > 0){//由于上面已经不满足,所有这下面比较大小的可以直接比较
value1(a,b,c);
}else if (derta < 0){
value3(a,b,c);
}
}
void value1(float a ,float b ,float c){
x1 = (-b + sqrt(derta)) / 2 * a;
x2 = (-b - sqrt(derta)) / 2 * a;
printf("方程的两个根分别为%f,%f",x1,x2);
}
void value2(float a ,float b ,float c){
x1 = -b / (2 * a);
x2 = -b / (2 * a);
printf("方程的两个根相同为%f",x1);
}
void value3(float a ,float b ,float c){
printf("方程没有实数根");
}
请给出一些实际的数值例子
把 0 改为 0.0,
取一个很小的数 E,(0.0000001), 如果 两数相减小于 E,那就认为它们相等。
首先函数定义的位置不对,应该在main上面。其次调用函数的方法不对,void是返回值类型,调用时不用写返回值类型。
还有函数里的float是变量类型,调用时也不用写。