浮点数比较的问题~~~~~~~~

dos5gw 2010-01-26 02:14:06
//老代码是这样的:
float CurrTemp;
CurrTemp=ReadShamberTemp(); //读出当前温度,ReadShamberTemp()函数返回一个float
if(CurrTemp >= 3.5) CurrTemp=5; //这个if明显有问题, 浮点判断不能直接用"="
if(CurrTemp < 3.5) CurrTemp=0;


//现在想改成这样,请问是否可行? 如果CurrTemp恰好==3.50, 会如何处理?
float CurrTemp;
CurrTemp=ReadShamberTemp(); //读出当前温度,ReadShamberTemp()函数返回一个float
if(CurrTemp < 3.5) CurrTemp=0;
else CurrTemp=5;

好像最近被浮点数的比较弄迷糊了
...全文
211 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
jikeyuan1 2011-01-24
  • 打赏
  • 举报
回复
LS回答的很好 参见c++高质量编程吧
gelu1040 2010-01-28
  • 打赏
  • 举报
回复
老的和你新的是一样的,你也知道是范围了,老的也将所有数分成两个区间,新的区间和老的一模一样,为什么不可以?

>=不是==
>=比>多一个点.
数学怎么学的啊
aoyihuashao 2010-01-28
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 geshuwei 的回复:]
那个if>=没错啊。我刚试了试,没错啊
[/Quote]

是没错,
我也试过,就是等于也不会错的。
float f = 0.0;
if (f == 0.0)
{
//会执行到的。
}
可书上说会错,可能是有某些某些某些没想到的情况吧。。
赵4老师 2010-01-27
  • 打赏
  • 举报
回复
因为a>=b和!(a<b)是一回事,所以用>=和==没任何关系,所以
if(CurrTemp >= 3.5) CurrTemp=5; //不是‘这个if明显有问题, 浮点判断不能直接用"=" ’而是‘没问题’
事实上
浮点判断不能用a==b和a!=b
分别要改成fabs(a-b)<=0.000001和fabs(a-b)>0.000001
而>,<,>=,<=尽管用应该没问题的。
geshuwei 2010-01-27
  • 打赏
  • 举报
回复
那个if>=没错啊。我刚试了试,没错啊
独行侠客2 2010-01-27
  • 打赏
  • 举报
回复
老代码没有任何问题。
dos5gw 2010-01-27
  • 打赏
  • 举报
回复
观望ing
就想叫yoko 2010-01-26
  • 打赏
  • 举报
回复
学习了~~~~~~~~~
xhappy 2010-01-26
  • 打赏
  • 举报
回复
绝对值比较不行?

float f;
int a;

if(abs(f-a)<=3.0)
{
.....
}

不知道这样行不行
z569362161 2010-01-26
  • 打赏
  • 举报
回复
比不了就不要比了
南气子水 2010-01-26
  • 打赏
  • 举报
回复

if (FLOAT_EQ(c, 3.500))
//这样当C在(3.500-0.001,3.500+0.0001)区间内,执行if
qvbnlaw 2010-01-26
  • 打赏
  • 举报
回复
不行!~~把!~~如果是3.500呢???那怎么办??
南气子水 2010-01-26
  • 打赏
  • 举报
回复

// Floating-point_number_precision.c
// Compile options needed: none. Value of c is printed with a decimal
// point precision of 10 and 6 (printf rounded value by default) to
// show the difference
#include <stdio.h>

#define EPSILON 0.0001 // Define your own tolerance//定义你的可以容忍的范围
#define FLOAT_EQ(x,v) (((v - EPSILON) < x) && (x <( v + EPSILON)))

int main() {
float a, b, c;

a = 1.345f;
b = 1.123f;
c = a + b;
if (FLOAT_EQ(c, 2.468)) // Remove comment for correct result //去掉注释得正确结果
//if (c == 2.468) // Comment this line for correct result //注释这一行得正确结果
printf("They are equal.\n");
else
printf("They are not equal! The value of c is %13.10f or %f\n",c,c);
}
aoyihuashao 2010-01-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 aoyihuashao 的回复:]
if(CurrTemp >= 3.5) CurrTemp=5; //这个if明显有问题, 浮点判断不能直接用"="

改成 if(fabs(CurrTemp -3.5) <0.1)  CurrTemp=5;
[/Quote]

更精确点吧
if(fabs(CurrTemp -3.5) <0.001) CurrTemp=5;
aoyihuashao 2010-01-26
  • 打赏
  • 举报
回复
if(CurrTemp >= 3.5) CurrTemp=5; //这个if明显有问题, 浮点判断不能直接用"="

改成 if(fabs(CurrTemp -3.5)<0.1) CurrTemp=5;
lovesi3344 2010-01-26
  • 打赏
  • 举报
回复
学习了
超gogo 2010-01-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 arnold9009 的回复:]
浮点数必须是范围比较,即
if ((x>=-EPSINON) && (x <=EPSINON))
其中EPSINON是允许的误差(即精度)。

[/Quote]

是的 应为存储的时候是以二进制存储的,对于浮点数会产生误差,所以要用上米娜的范围比较,
比如说大于-0.00000001小于0.00000001的就算是0
你如果非要精确比较,那就存成字符串类型,然后比较每位的大小是否相同
Arnold9009 2010-01-26
  • 打赏
  • 举报
回复
上面是x与0.0比较的情况
Arnold9009 2010-01-26
  • 打赏
  • 举报
回复
浮点数必须是范围比较,即
if ((x>=-EPSINON) && (x<=EPSINON))
其中EPSINON是允许的误差(即精度)。

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧