社区
C#
帖子详情
请问浮点数比较为什么会不准确?
月影
2009-04-12 02:34:39
计算机课程中我们会学到:不能直接用等号比较两个浮点数, 例如 if( .00033434 == .00033434) ;
请问浮点数为什么会不准确呢?
此问题纯属学术讨论, 没有任何其他目的。
...全文
1340
23
打赏
收藏
请问浮点数比较为什么会不准确?
计算机课程中我们会学到:不能直接用等号比较两个浮点数, 例如 if( .00033434 == .00033434) ; 请问浮点数为什么会不准确呢? 此问题纯属学术讨论, 没有任何其他目的。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
23 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
深海之蓝
2009-04-13
打赏
举报
回复
[Quote=引用 3 楼 sunny906 的回复:]
因为十进制小数转为二进制可能变为无限小数导致不精确
可以通过相减的差值和约定的精度相比较
例如:
if(fabs(f1-f2) <0.000001)
[/Quote]
正解
wartim
2009-04-13
打赏
举报
回复
这是由于计算机的浮点数格式决定的,从远古时期就有这问题了,
浮点数是由符号位、指数位、数据位构成的,不是像整形那样简单地构建
有篇专门讲浮点数的ieee标准的论文,看晕你
基于IEEE 754的浮点数存储格式分析研究
http://lw.china-b.com/gxlx/20090313/848581_1.html
vrhero
2009-04-13
打赏
举报
回复
基础问题...lz没学过计算机原理?从楼上的答案学过的竟然是少数...
gomoku
2009-04-13
打赏
举报
回复
[Quote=引用 12 楼 gentle_wolf 的回复:]
我要的是产生这个问题的原因。
[/Quote]
数学上浮点数是连续的,是
无限
的。
而计算机用
有限
的32位或64位来表示浮点,而32位的最多只能有4G种组合方法,即使是128位,它只能用来表示无限的数字中的某些点。
"某些点"以外的数就无法准确的用计算机浮点数来表示,这就是浮点误差的来源。
OKILOVE
2009-04-13
打赏
举报
回复
http://blog.csdn.net/biblereader/archive/2006/06/21/819428.aspx
“不能直接用等号比较两个浮点数”应该是比较一些特殊的浮点数
浮点数是不可以直接比较大小的,因为是非精确存储,只能设置一个精度,然后在允许误差内的就认为是相等的;对浮点型数比较的时候用==是不对的
#define E 0.000001
fabs((a+b)+c) - ((b+a)+c))<EPSIMON
C/C++语言中,浮点数常量默认就是double。明确指定是float可以使用:0.5f
浮点数也不是绝对不能精确的表示,比如0.5,0.25,0.125等等都是可以精确表示
对于可以精确表示的浮点数来说,==符号也是有意义的 但是对于大多数浮点数来说,是不能精确表示的,考虑到精度问题,两个也许实际不等的数值,比如
10000000.00000001 和 10000000 在pc当中被表示成为相同的数字了
对于确切两个浮点数 a+b 和 b+a 永远是等的
但是 (a+b)+c 和 (a+c)+b 就不一定
OKILOVE
2009-04-13
打赏
举报
回复
http://blog.csdn.net/cppptr/archive/2006/01/08/573372.aspx
http://blog.csdn.net/welman00chijian/archive/2006/02/21/604973.aspx
lz可以看看这个,我也受教了一次~
gjw_8888
2009-04-13
打赏
举报
回复
沒發現小數比較有不准的,只要同一類型數據定義同樣的精度
二進制的排列都一樣怎麼會不相等?
月影
2009-04-13
打赏
举报
回复
我发现这个问题不是一个简单的问题, 建议大家都去看看17楼说的那篇博客。如果能看懂, 都算是强人了。
sushou2009
2009-04-12
打赏
举报
回复
[Quote=引用 3 楼 sunny906 的回复:]
因为十进制小数转为二进制可能变为无限小数导致不精确
可以通过相减的差值和约定的精度相比较
例如:
if(fabs(f1-f2) <0.000001)
[/Quote]
说的不错!帮顶一个!
月影
2009-04-12
打赏
举报
回复
您的意思是计算机无法精确的表示0.4? 这个好像不对吧。
风龙-3
2009-04-12
打赏
举报
回复
应为计算机中数的表示精度有损失,在计算机中采用是二进制;浮点数的格式表达为基数、指数以及有效数;而基数为2表示的小数只能为0.5(2的-1次方),0.25 0.5+0.25等,如果要表示0.4则存在精度损失
月影
2009-04-12
打赏
举报
回复
请问 在C#中 2/3.0 是否等于 2 / 3.0 如下:
if (2 / 3.0 == 2 / 3.0)
{
Console.WriteLine("yes");
}
else
{
Console.WriteLine("No");
}
你认为结果是什么?(yes)
对了, 再次重申一遍, 不要说问题有没有意义或者说浮点数就是不准确, 我要的是产生这个问题的原因。
有人说, 无限循环小数表达为浮点数时会被舍入, 这个是正确的, 那么就像上面的代码一样, 两个一样的无限循环小数(他们都被舍入了)做比较。 结果会怎么样?
rczjp
2009-04-12
打赏
举报
回复
[Quote=引用 3 楼 sunny906 的回复:]
因为十进制小数转为二进制可能变为无限小数导致不精确
可以通过相减的差值和约定的精度相比较
例如:
if(fabs(f1-f2) <0.000001)
[/Quote]
是这样的
因为浮点数本来就不精确 两个数比较相等就不行
sillf
2009-04-12
打赏
举报
回复
这个很容易啊,就是在定义一个浮点类型的数的时候,本身就是一种是近似值,比如一个无限循环小数0.366666666.....,近似表示成的一个浮点数0.3667,同一个确定值的小数0.3667,在进行比较的时候,你认为能比较么?该浮点数显示出来的是0.3667,但是他的实质还是0.36666666.......,你认为比较还有意义么?
月影
2009-04-12
打赏
举报
回复
各位请注意, 我问的不是解决问题的办法, 而是产生问题的原因。
只有三楼的第一句话算是有效的回答。
不过还不是很精确, 如果有谁能举例说明就好了。
比如我要做如下操作:
if( 1.0/10.3 == 1.0 / 10.3)
//do something.
为什么不能这么做? 希望能用内存中的二进制的具体行为来解释这个问题产生的原因。
柳晛
2009-04-12
打赏
举报
回复
楼主看一下“浮点数”这个概念,理解浮点数是怎么个“浮”法,就明白为什么了。
zhu_chuan_hang
2009-04-12
打赏
举报
回复
浮点数一般是四舍五入后保留一定位数的数,所以不准确
十八道胡同
2009-04-12
打赏
举报
回复
是精度的问题吧,一般用fabs(x-y)<1e-10来判断2个浮点数相等。
zhangkunit
2009-04-12
打赏
举报
回复
可以如此这样实现x,y为你要比较的两个数:
fabs(x-y)<1e-9
来间接比较
zhangkunit
2009-04-12
打赏
举报
回复
浮点数本就是 近似值,比较没有意义
加载更多回复(3)
linux
比较
小数大小,
浮点数
比较
大小
本文探讨了为什么在Linux中直接使用'=='
比较
浮点数
可能
会
导致不
准确
的结果,原因是计算机中
浮点数
的存储和表示遵循IEEE 754标准,存在精度限制。通过示例代码展示了
浮点数
的二进制表示,并提供了
比较
浮点数
的建议方法。
浮点数
比较
本文探讨了
浮点数
在计算机中的表示方式,特别是IEEE标准下float与double类型的精度问题。由于
浮点数
尾数的有效位限制,转换为十进制时可能
会
超出范围,导致数值表达不
准确
。这解释了为什么在进行不同
浮点数
比较
时,即使数值看起来相同也可能存在微小差异。
python 怎么判断两个tensor相等_一日一技:在 Python 里面,如何正确判断两个
浮点数
相等...
由于
浮点数
的不精确性,直接使用等号判断两个
浮点数
是否相等是不
准确
的。正确的做法是判断它们的差值是否小于某个特定值。本文介绍了如何在Python中正确
比较
浮点数
,包括使用`math.isclose()`函数进行
比较
,并解释了为什么不能直接用差值的绝对值进行判断。
double compare 0
本文解释了为什么在编程中直接
比较
两个
浮点数
(如double或float类型)可能
会
导致不
准确
的结果。这是因为这些类型的数值存储的是近似值,存在一定的精度误差。文章通过举例说明了如何正确地在一个可接受的误差范围内进行
比较
。
为什么说
比较
两个
浮点数
是否相等是不安全的?
浮点数
表示法由于其有限的精度,可能导致计算结果的不精确。在
比较
浮点数
是否相等时,直接
比较
可能
会
出错,因为即使数学上相等的运算也可能产生微小的差异。正确的
比较
方法是设定一个误差范围,判断两个数是否在误差范围内接近。此外,浮点运算的顺序和精度问题在连续运算时
会
累积误差,影响最终结果的
准确
性。理解
浮点数
的表示和运算机制对于避免这类问题至关重要。
C#
111,130
社区成员
642,541
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章