ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: sunnet

[已解决] 浮点运算误差带来的看不懂

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2011-6-7 23:46 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
2010 事故依旧。这个难题应该很难解决吧。
另外发现,减号运算和等号运算的精度不一样。
试试
A1=0.2-0.3
B1=-0.1
=A1=B1             得出TRUE
=A1-B1=0         得出FALSE
也就是说等号运算比减号运算的精度要低。

TA的精华主题

TA的得分主题

发表于 2011-6-8 10:20 | 显示全部楼层
我来回看了一圈,还是没有看明白什么是“浮点运算”,晕死了

打个比方吧,我问什么是人,你们指着一个人说:那就是人。 都在说表象,能否来一个定义呢,到底什么是浮点运算?

TA的精华主题

TA的得分主题

发表于 2011-6-8 12:00 | 显示全部楼层
原帖由 xpczff 于 2011-6-8 10:20 发表
我来回看了一圈,还是没有看明白什么是“浮点运算”,晕死了

打个比方吧,我问什么是人,你们指着一个人说:那就是人。 都在说表象,能否来一个定义呢,到底什么是浮点运算?

个人认为,浮点运算这个些英文愿意是 floating. 也就是不确定的意思,是相对整形,integer, 长形,long ,双倍数 double 来讲的。运算时以机器认可的最大精度来计算。
当然,这个精度不可能无限精确。比如,1/3 小数点后面有无数位。机器的内存不可能这么有无限大。所以我们只能用机器认定的最大精度,从而舍弃剩下的小数部份。这个是理想和现实间差距的痛楚。无力回天。另外一个误差可能来源于计算模式。 我们知道 计算机有迭加运算,与运算,移位运算等等方法,还有很多不为大多数人所知的运算技巧,特别在于提高运算速度上下工夫而使用的运算方法。这些运算方法都直接或间接地产生了运算误差。

一点拙见,请大家补充指正。

TA的精华主题

TA的得分主题

发表于 2011-6-8 18:46 | 显示全部楼层
原帖由 xpczff 于 2011-6-8 10:20 发表
我来回看了一圈,还是没有看明白什么是“浮点运算”,晕死了
打个比方吧,我问什么是人,你们指着一个人说:那就是人。 都在说表象,能否来一个定义呢,到底什么是浮点运算?


这倒也不奇怪,这个概念懂不懂的人都爱说两嘴。。。。。。

浮点,定点的意思是指小数点的位置

定点小数:小数点位置固定。

以十进制为例,假设一个数值类型可以有6个十进制位置,那么定点类型无须记录小数点位置,可以有以下类型:

整数类型,小数点位置就一定是个位后面,能够表达的最精确数字就是1,能够表达的范围是 000000 - 999999

两位小数类型,小数点位置就一定是百分位,能够表达的最精确数字就是0.01,,能够表达的范围是 0000.00 - 9999.99
。。。。。。等等

浮点小数:小数点位置可以变动,并且需要额外的记录去描述这个变动的小数点位置。

假设这里把其中一个位置用于记录小数点位置(可变范围 0-9),并且规定:

小数点位置取5,表示精度是1,小数点在个位后面,这个数值类型有0个小数位,可以表示 00000 到 99999 的数 (注意:这里只有5位有效数字)

小数点位置取6,表示精度是 0.1,小数点在十分位后面,这个数值类型有1个小数位,可以表示 0000.0 到 9999.9 的数

小数点位置取9,表示精度是 0.0001,小数点在万分位后面,这个数值类型有4个小数位,可以表示 0.0000 到 9.9999 的数
......
小数点位置取4,表示精度是 10,表示小数点在十位,这个数值类型可以表示 00000 x 10 到 999990 的数,精度是 10
......
小数点位置取0,表示精度是 100000,表示小数点在十万位,这个数值类型可以表示 00000 x 100000 到 9999900000 的数,精度是 100000

可见浮点小数通过可变的小数位置,使一个数值类型可以用一部分表示有效数字,另一部分表述每一单位有效数字的倍率

从而灵活地表示很大范围的数值,代价是:由于用了一部分记录内容去记录小数点位置,所以有效数字的长度比定点小数要低。

而且,一些定点数运算不会出现的问题,在浮点数运算会出现

如两个数相加
如果第一个浮点数是 100.01,第二个浮点数是 9999900000

按上述规则,这两个都是合法的浮点数,可是它们的和 99999000100.01 却无法用同一个浮点数类型表示出来。

一般计算机碰到这种情况,就会自动按比较大的数值来四舍五入,于是

100.01 + 9999900000 = 9999900000 (出现了100.01的误差)

这也是浮点数误差产生的一个原因:小的数值被大的数值“吸收”了。

要在Excel证明这一点就太简单了,因为excel的double类型浮点小数只有15个有效数字(即最多记录15个十进制数字)

所以Excel的单元格运算 12345012345678900000 + 12345.0123456789 = 12345012345678900000

其实,所谓小数,小数点都是人类的数学概念,计算机内部的运算实际上是 整数x单位精度。

也就是说,计算机内部根本不存在小数,只有不同精度的整数!

[ 本帖最后由 灰袍法师 于 2011-6-8 19:05 编辑 ]

TA的精华主题

TA的得分主题

发表于 2011-6-9 00:52 | 显示全部楼层
原帖由 灰袍法师 于 2011-6-8 18:46 发表


计算机内部根本不存在小数,只有不同精度的整数!

这种说法应该说非常恰当。 灰袍法师好象是搞计算机的吧。对运算方法有深入了解。

TA的精华主题

TA的得分主题

发表于 2011-6-10 00:04 | 显示全部楼层
灰袍法师的见解很深,拜读。

TA的精华主题

TA的得分主题

发表于 2011-8-24 19:54 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-11-11 08:49 | 显示全部楼层
其实解决起来没什么难的,就是让浮点变成定点,excel多一个精度的选择,比如我选择10的-10次方,我认为可以了,就按照这样计算

TA的精华主题

TA的得分主题

发表于 2012-2-15 17:26 | 显示全部楼层
半榻茶烟 发表于 2003-12-13 23:42
其实说奇怪也不奇怪,EXCEL本来就只能输入15位的数字,如果超过15位,15位以后都变成了0(但前面的0不算),问题的 ...

少于15位也存在浮点问题,真是烦人!!!

TA的精华主题

TA的得分主题

发表于 2012-2-15 18:04 | 显示全部楼层
我的是2007就不会出现这些问题了吧?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-23 21:02 , Processed in 0.032418 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表