社区
C++ 语言
帖子详情
float变量和0比较的疑问
look01
2006-02-18 10:31:42
不太明白float变量为何不能和0直接比较,却要
float a;
if(a>=-0.00001 <= 0.00001)
另外我在vc上调试可以直接比较的,不太明白林博士的意思.
...全文
4904
10
打赏
收藏
float变量和0比较的疑问
不太明白float变量为何不能和0直接比较,却要 float a; if(a>=-0.00001 <= 0.00001) 另外我在vc上调试可以直接比较的,不太明白林博士的意思.
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
10 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Rick_ang
2006-02-19
打赏
举报
回复
你上面那式子不就是a-b==EPSINON么~~应该是a - b >= -EPSINON && a -b <= EPSINON
Wolf0403
2006-02-19
打赏
举报
回复
look01 的问题可以参考 du51 朋友转贴的文章里的解释。
Wolf0403
2006-02-19
打赏
举报
回复
double 和 float 一样是浮点数,区别只在于表达数值的范围和精度。使用 operator== 对两个浮点数进行精确比较始终是不可靠的,不论 double 还是 float。
look01
2006-02-19
打赏
举报
回复
const float EPSINON = 0.00001;
float a = 0.000001;
float b = 0.000001;
if (a - b >= EPSINON && a -b <= EPSINON)
{
cout << "equal"<< endl;
}
vc上运行并没有equal,我不是太理解,这个例子举的是否不对?
Featured
2006-02-18
打赏
举报
回复
如果你实在懒,就用double好了
double的可以直接比较的
但是性能上有损失
eric8231
2006-02-18
打赏
举报
回复
因为一般来讲,对于一个浮点数,你不会只是把它干巴巴的放在那里,通常我们都会对浮点数进行比较复杂的运算,那么在运算的过程中,就有可能发生四舍五入的情况。
所以,对于一个进行了一些可能导致四舍五入的运算的浮点数而言,我们不能保证它的准确性(当然这里的误差是非常非常小的)。所以,在对浮点数比较的时候,就需要考虑到这些、误差,方法之一就是,让浮点数与一段数值范围比较,而不是与一个确定的数值比较。
look01
2006-02-18
打赏
举报
回复
这么多兄弟在啊,谢谢大家了
cenlmmx
2006-02-18
打赏
举报
回复
float是浮点 它的值只能说是接近不能说是准确 总存在误差
专心使用 float x = 0;
if( x == 0 )总经常不成立 因为x= 0.0000004这样也算是== 0
du51
2006-02-18
打赏
举报
回复
转贴一文章
浮点数的比较
在数学运算当中经常会涉及到判断两个数是否相等的情况
对于整数很好处理 A==B这样的一个语句就可以解决全部的问题
但是对于浮点数是不同的
首先,浮点数在计算机当中的二进制表达方式就决定了大多数浮点数都是无法精确的表达的
现在的计算机大部分都是数字计算机,不是模拟机,数字机的离散化的数据表示方法自然无法精确表达大部分的数据量的。
其次计算机浮点数的精度在单精度float类型下,只有7位,在进行浮点运算的时候,这个精度往往会导致运算的结果和实际期望的结果之间有误差
因为前两个原因,我们很难用 A==B来判定两个浮点数是否相同
很自然,我们可以想到 fabs(A-B) < epsilon 这样的一种判别方法
但是这种判别方法稳妥吗?
它也不稳妥。
首先, epsilon是一个绝对的数据,也就是误差分析当中说说的绝对误差
使用一个固定的数值,对于float类型可以表达的整个数域来说是不可以的
比如epsilon取值为0.0001,而a和b的数值大小也是0.0001附近的,那么显然不合适
另外对于a和b大小是10000这样的数据的时候,它也不合适,因为10000和10001也可以认为是相等的呢
适合它的情况只是a或者b在1或者0附近的时候
既然绝对误差不可以,那么自然的我们就会想到了相对误差
bool IsEqual(float a, float b, float relError ) {
return ( fabs ( (a-b)/a ) < relError ) ? true : false;
}
这样写还不完善,因为是拿固定的第一个参数做比较的,那么在调用
IsEqual(a, b, relError ) 和 IsEqual(b, a, relError ) 的时候,可能得到不同的结果
同时如果第一个参数是0的话,就有可能是除0溢出
这个可以改造
把除数选取为a和b当中绝对数值较大的即可
bool IsEqual(float a, float b, relError )
{
if (fabs(a)<fabs(b)) return ( fabs((a-b)/a) > relError ) ? true : false;
return (fabs( (a-b)/b) > relError ) ? true : false;
};
使用相对误差就很完善吗?
也不是, 在某些特殊情况下, 相对误差也不能代表全部
比如在判断空间三点是否共线的时候,使用判断点到另外两个点形成的线段的距离的方法的时候
只用相对误差是不够的,应为线段距离可能很段,也可能很长,点到线段的距离,以及线段的长度做综合比较的时候,需要相对误差和绝对误差结合的方式才可以
相对完整的比较算法应该如下:
bool IsEqual(float a, float b, float absError, float relError )
{
if (a==b) return true;
if (fabs(a-b)<absError ) return true;
if (fabs(a>b) return (fabs((a-b)/a>relError ) ? true : false;
return (fabs((a-b)/b>relError ) ? true : false;
}
这样才相对完整
Rick_ang
2006-02-18
打赏
举报
回复
因为作为float会有误差,比如你赋了float a=0;a是有可能是0.000000001的
java定义
float
变量
必须加f吗
实现Java定义
float
变量
必须加f 介绍 作为一名经验丰富的开发者,今天我将教你如何在Java中定义
float
变量
时必须加上"f"后缀。 流程步骤 Java定义
float
变量
必须加f#render_12_870421017-svg{font-family:"trebuchet ms...
Java重学
疑问
——为什么
float
型赋值要加f或F?
float
类型
变量
值后加baiF 表示这个
变量
du是
float
类型
变量
是一种数字精度表示法。 例如
float
f = 0.0;//这个dao是会报错的,但是...尾数表示浮点数有效数字,0.xxxxxxx,但不存开头的0和点 指数存指数的有效数字。 指数
C 中
float
和 double 类型的精度差异
在上述代码中,我们声明了一个
float
类型的
变量
float
Num 和一个 double 类型的
变量
doubleNum。与
float
类型相比,double 类型具有更高的精度,可以提供更准确的计算结果。在进行浮点数计算时,需要注意
float
...
若 a 是
float
型
变量
,b 是 unsigned 型
变量
,以下输入语句中合法的是()。
A.scanf("%6.2f%d",&a,&b); B.scanf("%f%n",&a,&b); C.scanf("%f%3o",&a,&b); D.scanf("%f%f",&a,&b);...BC都对,B中的%n表示输入的字符的个数,用无符号数表示,正确;C中%3o表示八进制数,输入的宽度不...
疑问
:
c语言
float
自增,C语言自增(++)和自减(--)
一个整数类型的
变量
自身加 1 可以这样写:a = a + 1;或者a += 1;不过,C语言还支持另外一种更加简洁的写法,就是:a++;或者++a;这种写法叫做自加或自增,意思很明确,就是每次自身加 1。相应的,也有a--和--a,它们...
C++ 语言
65,190
社区成员
250,526
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章