| 作者 | 主题 |
|---|---|
|
芳季 至圣
经验值:72108 发帖数:15503 精华帖:101 |
楼主
主题:问个浮点数判断的事情。
一个浮点数经过一个会使其改变大小的运算,例如加1.0,或者其他运算。会有一种情况,就是,原数经过运算之后仍然等于原数,那么这个运算就是失效的了。这个现象对于浮点运算来说也很平常。 就拿加1.0说事,我用什么程序判断这个加一,加了等于没加?运算程序失效了。 例如三千万加10,等于三千万零九。此时接通一个点,报告计算失效。 问题是我事前并不知道三千万加10等于多少,然后它给了我这个三千万零九的答案,我鬼知道是对还是错? |
|
龟仙人 奇侠 经验值:8565 发帖数:928 精华帖:15 |
4楼
主题:回复:问个浮点数判断的事情。浮点数的尾数精度是7位,所以如果数值大于1x10^7时精度已经达到了1,如果1x10^8时精度是10,结果如果加上小于10的数可能就不对了,这是我的理解,也没有去研究IEEE754标准。 |
|
tingal_cai 侠士 经验值:1019 发帖数:85 精华帖:1 |
9楼
主题:回复:问个浮点数判断的事情。你指的是两个来源不同的浮点数比较,是属于横向比较,这种情况确实需要谨慎,但我写的是纵向比较,即本次值跟前一次值比较,所以不存在你说的问题 |
|
xiatianyun 奇侠 经验值:5423 发帖数:850 精华帖:10 |
11楼
主题:回复:问个浮点数判断的事情。好问题。 我也不知道。 或者可以有些启发: Real1 + Real2 = NewReal 如果(NewReal - Real1) 超出了 (Real2 +- ErrReal), 则意味着出现了楼主说的情况,可以输出一个信号了。 ErrReal 是允许的误差。 |
|
芳季 至圣 经验值:72108 发帖数:15503 精华帖:101 |
12楼
主题:回复:问个浮点数判断的事情。先别觉得人家要谢你。 得数相同就说明计算过程失效了吗? 等的吗?虽然我没有办法证明不等。但是你证明一下相等。 要是输入值真的没发生变化呢?要是这个不是单调函数呢? 要是你把我的“要是”都写到程序里,也不能担保我“要是”完了。 |
|
tingal_cai 侠士 经验值:1019 发帖数:85 精华帖:1 |
13楼
主题:回复:问个浮点数判断的事情。我觉得你自己把你自己绕进去了,你的原话:“ 就拿加1.0说事,我用什么程序判断这个加一,加了等于没加?运算程序失效了。 ” 由于精度问题,确实有可能加了等于没加,那上面的办法就可以帮你判断加了等于没加。 |
|
holdkcsxyz 至圣 经验值:13735 发帖数:1560 精华帖:24 |
14楼
主题:回复:问个浮点数判断的事情。浮点数的一些变量计算有时需要残差补偿,并且差分当前项和历史项必须满足一定的递推关系,才能进行补偿;如果不满足递推关系可以通过初中讲的配方法分解因式来"配平"具体参看数值计算. 克罗内克:“上帝创造自然数,别的都是人造的” 当然一些非实时的场合,也可以用上位机开发一个简单的后台计算器decimal运算后再转成不失精度的数据TCP发给PLC. |
|
芳季 至圣 经验值:72108 发帖数:15503 精华帖:101 |
16楼
主题:回复:问个浮点数判断的事情。我没办法不用加一来说明。要么我写成这样 y(n) = q*x(n) + (1-q)*y(n-1) 我是不是要另花时间去解释y是什么n是什么y(n)是什么……这些都与矛盾无关。我不希望翻出很多事情。一句加一代替所有。 |
|
yanxiao 版主 经验值:28601 发帖数:12143 精华帖:46 |
18楼
主题:回复:问个浮点数判断的事情。这个问题,我是这样理解的: 1、浮点数存在大数吃小数问题,具体的运算是加减,本质是加运算。 2、这个问题一般出现在累加场合,谁是大数能够确定。 3、假如Real1是大数,Real2是小数,NewReal是相加后的和值。 4、相加后,究竟产生了多少的精度损失? 5、做abs(Real1-NewReal)的差值,与abs(Real2)作比较,假如Real2为非零值,可以用百分比表示误差。 6、abs(Real1-NewReal)/abs(Real2)超出某一范围,认为误差已不可接受,点亮AL指示。 |
|
夕阳渔歌 侠士 经验值:1716 发帖数:81 精华帖:1 |
19楼
主题:回复:问个浮点数判断的事情。浮点值本身缺陷----1、七位有效值;2、通常是接近实际值而不是等于实际值;编程时不考虑这两个问题,往往就会出现BUG。 |
|
芳季 至圣 经验值:72108 发帖数:15503 精华帖:101 |
20楼
主题:回复:问个浮点数判断的事情。做过我上面那个滤波器的都明白,理论上,单调输入,即使输入侧不变了,等号左边永远都不能等于等号右边。滤波器始终不能输出这个输入值。等号右边,加号左侧就是一个很大数,加号右侧就是一个很小数。 我如何判断滤波器己经到了这种境地?此时我要强制输出等于输入。 事情就是这样子了。 |
|
Zane 至圣 经验值:85161 发帖数:21047 精华帖:399 |
25楼
主题:回复:问个浮点数判断的事情。
Zane
注册自动化系统工程师
Always save before download
|
|
芳季 至圣 经验值:72108 发帖数:15503 精华帖:101 |
26楼
主题:回复:问个浮点数判断的事情。看来只有这种原理的方法解决。不过我仍然在幻想有人可以从一些数字原理而不是代数原理来轻松解决此事。例如有个艺高人用XOR处理80个什么那帖,使我感到震撼。 |
|
sangshunyang 侠圣 经验值:4443 发帖数:618 精华帖:4 |
27楼
主题:回复:问个浮点数判断的事情。花点时间认真学习下 IEEE754就不会纠结原理的事。浮点数加和我们算术上的加法类似,算术上是小数点对齐,浮点数是阶码对齐,阶码对齐就要移动小数点位置,如果移动的位置超过了24位(32位浮点数,2的24次方)就把该数字包含数值全部移除,加这个数就是加 0 。两个数相加不会累加就是两个数绝对值比值大于了2的24次方。当然不是说两个数比值小于2的24方就可以不考虑其他了,实际上只要移动小数点都有可能改变原来的值,但这时两个数相加和肯定比一个数要大。TIA帮助中说的小数点对齐是不准确的。 另外 1+1÷3=1。 这是把概念搞错了 1÷3=0 是整数除法,大多数计算机语言都会 1 , 3 这种常数看成整数类型处理 如果改成 1+1.0 ÷3,1+1.0 ÷3.0, 1+1÷3.0 表达式的结果又是什么。 在SCL语言中对于常数提倡提供具体类型 INT#1+REAL#1/REAL#3 |
|
逐光之路 游民 经验值:123 发帖数:13 精华帖:0 |
28楼
主题:回复:问个浮点数判断的事情。程序架构时就要考虑变量精度和极限问题。 |
|
芳季 至圣 经验值:72108 发帖数:15503 精华帖:101 |
29楼
主题:回复:问个浮点数判断的事情。我是真没有学习过这个IEEE754。楼上等人应该有人会这个754的。这只是知道数据的构造,事实依然存在,依然要解决。不见得懂了这个754就没有这样的纠结。大概只是不纠结给你看到而已。 |
|
tingal_cai 侠士 经验值:1019 发帖数:85 精华帖:1 |
30楼
主题:回复:问个浮点数判断的事情。 |
|
芳季 至圣 经验值:72108 发帖数:15503 精华帖:101 |
31楼
主题:回复:问个浮点数判断的事情。问题是我现在已经在坑里面了。让我知道坑的深度;宽度;形成时间;地质结构;地理位置;海拔高度……这些。对我怎样爬上来没有帮助。对我要绕过它有帮助。 关键是我爬上来后要想办法从坑上面过。 |
|
芳季 至圣 经验值:72108 发帖数:15503 精华帖:101 |
32楼
主题:回复:问个浮点数判断的事情。我现在是比较输入和输出,差绝对值在一个程序能接受的范围内,就把滤波器直通了。接受范围大,就早点直通。接受范围小,就晚点接通。原理和大家都是类似的,也是经过附加一番计算。Z的方法是就像洛氏硬度计那样,加载了再卸载,看回弹了多少。一下子到了极致,到了数字精度的尽头。T的方法就是判断变化过。我的方法就是适用到什么程度就判断什么程度。很粗糙的情况下比较节省资源。 我程序就不上了。太丑了,地毯级的程序。不能跟神级和天花板级同台献技。 但是我还是觉得有没有方法更加节省扫描时间?因为一旦有用,将会在很多地方作为浮点数的判断。系统提供的大于;大于等于;等于;小于等于;小于感觉有些情况不太适用。例如要10.00的东西什么才是10.00,误差1.00。滤波要滤到什么程度才够? |