找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 869|回复: 3

[研讨] 浮点运算对fix函数的影响

[复制链接]

已领礼包: 6530个

财富等级: 富甲天下

发表于 2017-2-23 12:18:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
先来一个例子:
命令: (/ 224.45 0.1)
2244.5
命令: (+ (/ 224.45 0.1) 0.5)
2245.0
命令: (fix (+ (/ 224.45 0.1) 0.5))
2244

这是刚才对http://bbs.xdcad.net/thread-707236-1-1.html测试碰到的问题,看出点什么没有?
再来一例:
命令: (/ (log 1000) (log 10))
3.0
命令: (fix (/ (log 1000) (log 10)))
2

命令: (fix (/ (log 999) (log 10)))
2
这是在程序中求数值位数的常用方法,数值1000竟然是3位数?
一定是哪里错了,答案是fix取整时,受到浮点数的影响,在数值运算结果有极小误差时出错。
本人理解,这是个机理容易明白,但无法确定的错误,受操作系统计算精度和软件(Lisp)浮点数精度的影响,目前尚无有效方法进行完全解决。
目前发现的因为浮点数运算的错误主要表现在对fix函数有一定的影响,其实不限于fix函数,比如第一个例子中的运算:
命令: (= (/ 224.45 0.1) 2244.5)
nil

所以,在http://bbs.xdcad.net/thread-707236-1-1.html中使用了1e-12这个极小的补数对运算结果错误进行最大可能的规避,但这种规避同时也带来了自己的几乎的可见的错误,但权衡下来,这些规避是很必要的。
以上是本人对浮点数影响的一些所见及理解,在这里说出来,未必全正确,不过是希望大家在编程及测试时遇到类似情况不必大惊小怪,并尽可能地规避而已。
如果有哪位朋友对这个问题有更好的见解或解决方法,也希望不吝赐教,就算是给大家的福利吧。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 20个

财富等级: 恭喜发财

发表于 2017-2-23 12:59:29 | 显示全部楼层
这个和浮点数在计算机中的存储方式有关,我记得

只要是浮点数除法的,结果就不能用=和其他比较,乘法有时候行(取决于浮点数值)

拿长老的例子看:

看看:
命令: (= (/ 224.45 0.1) 2244.5)
nil
命令: (= (* 224.45 10) 2244.5)
T

所以,不管是什么浮点数的比较,都一律不应该用=, 要转换成 > <比较。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2017-2-23 15:17:08 | 显示全部楼层
本帖最后由 csharp 于 2017-2-23 15:20 编辑

一般相等用 fabs(a-b)<精度 判断,alisp 就是 (<= (abs (- a b)) 精度) 或者 (equal a b 精度) 了
equal 也要注意
_$ (equal 1.0 0.5 0.5)
nil
_$ (equal 1.0 0.5 0.500001)
T
_$

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6579个

财富等级: 富甲天下

发表于 2017-2-24 00:12:41 | 显示全部楼层
謝謝提供科普.學習了!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-23 00:23 , Processed in 0.393203 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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