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
为什么浮点数不能直接作“等值⽐较”?
在以前看书或看⽂章就知道有这件事了。知道是因为“精度”,但⼀直没有真正想过问题的严重性。
今天在易⾃考ikao看到⼀个帖⼦,顺便搜索了⼀下,测试结果让我信服了这条规则:
以下内容引⽤⾃林锐《⾼质量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;浮点型变量float
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精度更⼤⼀些。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论