浮点数与0值的比较

在处理浮点数时,直接与0比较可能导致因误差导致的错误结果。应定义一个误差上限来比较,确保精度。通过使用#define定义精度,可以减少误差并得到正确答案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在函数中,根据问题领域所容许的的精度,定义一个误差上限(一个极小数)。然后在浮点计算时,计算结果与这个误差上限作比较,而不是与0作比较。如果与0进行比较,误差会使程序结果发生改变,如下图中的球一元二次方程式的解,由于误差,所以程序结果出现错误。

 

测试结果

 

 

其代码如下

#include "stdio.h"
#include "math.h"


void A(double a,double b,double c)
{
	double x1;
	double x2;
	double d = b*b - 4*a*c;
	if(a=0)
	{
		x1=x2 =-c/b;
		printf("x1=%f,x2=%f\n",x1,x2);
	}
	else if(d=0)
	{
		x1=x2=-b/(2*a);
		printf("x1=%f,x2=%f\n",x1,x2);
	}
	else if(d >0)//d>0
	{
		x1 = (-b+sqrt(d))/(2*a);
		x2 = (-b-sqrt(d))/(2*a);
		printf("x1=%f,x2=%f\n",x1,x2);
	}
	else
	{
		printf("无实根\n");
	}
}




int main()
{
	A(0,1,1);
	A(1,2,1);
	A(2,1,2);
	A(0,1,2);
	A(1,2,1);
	A(1,4,2);
	A(1,1,1);
	return 0;
}

 

但是如果使用#define,将其精度确定,减少其误差,那可以得到正确的答案。

 

如下

 

而结果也会得到正确的结果

 

 

 

其代码如下

#include "stdio.h"
#include "math.h"

#define EPS 0.0000001
void A(double a,double b,double c)
{
	double x1;
	double x2;
	double d = b*b - 4*a*c;
	if(-EPS<=a && a<=EPS)
	{
		x1=x2 =-c/b;
		printf("x1=%f,x2=%f\n",x1,x2);
	}
	else if(-EPS<=d && d<=EPS)//d==0
	{
		x1=x2=-b/(2*a);
		printf("x1=%f,x2=%f\n",x1,x2);
	}
	else if(d > EPS)//d>0
	{
		x1 = (-b+sqrt(d))/(2*a);
		x2 = (-b-sqrt(d))/(2*a);
		printf("x1=%f,x2=%f\n",x1,x2);
	}
	else
	{
		printf("无实根\n");
	}
}


int main()
{
	A(0,1,1);
	A(1,2,1);
	A(2,1,2);
	A(0,1,2);
	A(1,2,1);
	A(1,4,2);
	A(1,1,1);
	return 0;
}

 

 

 

这个实例告诉我们在以后的编程过程中,doublefloat定义的数与0比较时,需要提前定义精度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值