c语言float与零值比较,float 浮点数与零值0比较大小 ZZ

写出float  x 与“零值”比较的if语句

请写出 float  x 与“零值”比较的 if 语句:

const float EPSINON = 0.00001;

if ((x >= - EPSINON) && (x <= EPSINON)

不可将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”此类形式。

EPSINON

应该是一个很小的值吧

因为计算机在处理浮点数的时候是有误差的,所以判断两个浮点数是不是相同,是要判断是不是落在同一个区间的,这个区间就是

[-EPSINON,EPSINON]   EPSINON一般很小,10的-6次方以下吧,具体的好像不确定的,和机器有关

[结论]浮点数等值比较使用下式:

#include

#include

fabs(a - b) < FLT_EPSILON

三个EPSILON:

FLT_EPSILON

DBL_EPSILON

LDBL_EPSILON

为什么浮点数不能直接作“等值比较”?

在以前看书或看文章就知道有这件事了。知道是因为“精度”,但一直没有真正想过问题的严重性。

今天在易自考www.ezikao.com.cn看到一个帖子,顺便搜索了一下,测试结果让我信服了这条规则:

易自考帖子:http://www.ezikao.com.cn/bbs_disp.asp?boardid=47&id=79506

以下内容引用自林锐《高质量C/C++代码编写指南》

4.3.3 浮点变量与零值比较

? 【规则4-3-3】不可将浮点变量用“==”或“!=”与任何数字比较。

千万要留意,无论是float还是double类型的变量,都有精度限制。所以一定要避免将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。

假设浮点变量的名字为x,应当将

if (x == 0.0) // 隐含错误的比较

转化为

if ((x>=-EPSINON) && (x<=EPSINON))

其中EPSINON是允许的误差(即精度)。

最好定义一个符号常量来做。#define EPSILON 1e-6

也可以想一下,0.9无限循环不是等于1吗?

如果正好某个值等于0.9循环,浮点数只能给出一个“确定”的值,那就会“做错题”。

我参照这篇文章写了这个例子:

#include

#include

main()

{

float d1, d2, d3, d4;

d1 = 194268.02;

d2 = 194268;

d4 = 0.02;

d3 = d1 - d2;

if (d3 > d4)

printf(">0.02/n");

else if (d3 < d4)

printf("<0.02/n");

else

printf("=0.02/n");

printf("%f - %f = %f /n", d1,d2,d3);

system("pause");

}

请看结果:

<0.02

194268.015625 - 194268.000000 = 0.015625

即:194268.02 - 194268.0 不等于 0.02!

存进去的数居然会变!怕了吧?

4个变量改成double型的,再测试:

这是结果

<0.02

194268.020000 - 194268.000000 = 0.020000

明明是0.02啊,怎么还是小于?

这次没有改我存的数了吧?WHY?

我说,我怕了,以后我再不敢用浮点数直接作相等比较了!

还是那句话:浮点数都是有精度限制的。

所以你存的数,不一定就是你要的数。

虽然这件事很值得郁闷,不过我还是很高兴又知道了点东西。

关于EPSILON,可不是能随便定义的!

而且应该能想到,double和float的EPSINON是不同的。

定义成什么呢?不必你去定义了,ANSI C已经定义了这些常量:

载入头文件

#include float.h里面有许多关于浮点类型的定义。

如:

FLT_EPSILON

DBL_EPSILON

LDBL_EPSILON

查看include文件,在float.h头文件中有很多关于浮点数的宏定义:

[quote]#define FLT_EPSILON                1.19209290E-07F

#define LDBL_EPSILON                1.084202172485504E-19[/quote]

(我们自己定义FLT_EPSILON一般定义为

const int FLT_EPSILON=1e-6;就可以了。

这两个宏定义可用来作为float、 long double趋0最小的判断值。即:

#include ;

double a, b;

if( abs(a-b) < FLT_EPSILON)

曾经令我疑惑的是abs,a-b也是浮点数,而abs的原型是

int abs(int a)

对int取绝对值。

float fabs(float a)

fabs才是对float去绝对值,但是在实际运行汇总

float a1=-3.14;

cout<

2个输出的结果是一样的。都是3.14.

abs与fabs的区别应该是精度不同,fabs精度更大一些。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中,当我们要比较一个float类型的变量和零值时,我们不能使用"=="或"!="来进行比较,因为float类型是不精确的。相反,我们应该使用">="或"<="的形式来进行比较。例如,我们可以使用以下代码来比较一个float变量flag是否等于零值: ``` const float NORM = 0.00001; float flag = 0.0; if((flag >= -NORM) && (flag <= NORM)) { printf("flag equal zero.\n", flag); } else { printf("flag not equal zero.\n"); } ``` 在这个例子中,我们定义了一个常量NORM,它表示我们认为与零值相等的浮点数的范围。然后,我们将变量flag初始化为0.0,并使用">="和"<="来判断它是否在NORM的范围内。如果是,则打印"flag equal zero.";如果不是,则打印"flag not equal zero."。这样我们就可以正确地比较一个float变量与零值了。123 #### 引用[.reference_title] - *1* [【浮点数零值比较】](https://blog.csdn.net/qq_43727529/article/details/122298958)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] - *2* *3* [float变量与零值比较 .](https://blog.csdn.net/chenhezhuyan/article/details/19408151)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值