作者Peruheru (还在想)
看板Visual_Basic
标题[.NET] 浮点数变成1.#QNAN的样子了
时间Thu Apr 16 23:12:19 2009
请输入专案类型(网站专案或者应用程式专案):应用程式专案
这是延续我之前问的那几个问题的程式
我有用VB来算矩阵的加减乘法运算(後来做的,是不可或缺的部分)
不晓得有没有人看过我在Ask版也问过的,关於Kalman滤波器
我在做的就是这个东西
到头来我还是不了解原理,只能照着给我的规格流程来做
我做的这个东西分成两个部分
一部分是模拟系统,一部分是参数预测(这部分就是Kalman滤波器负责的)
先丢一组预设的参数给模拟系统
模拟系统模拟完後的状态丢给Kalman
Kalman进行运算後得到新的参数再丢给模拟系统来做模拟
模拟系统的部分我大致完成了
但是产生新的参数时
大概在第60几次左右会使得参数矩阵变成1.#QNAN这个值(型态是Double)
然後就会发生错误,因为这个值不能拿来运算
(但是很奇怪,产生这个数时却没有告诉我有错误)
我搜寻了一下都没看到什麽可用的说明
只大概知道这是表示「浮点数的小数部分非实数」或是类似得概念
但是我觉得很奇怪
这个Kalman的运算中,只有乘法,加法,和减法的运算(虽然是矩阵的)
不管怎麽说,非实数这种东西不是要负数开根号才会出现吗?
我的运算中,矩阵的内容完全没有任何地方有开根号
那请问怎麽会出现这种错误呢?
我侦错功力不够好
对於这个滤波器又不了解
我实在无法理解为何简单的加减乘除运算会产生非实数的结果
我这个运算又有乱数影响,导致每次出现错误的点都有点不同
没办法锁定是第几次一定会出错
想请问这个错误有可能有其他途径产生吗?
我又要如何预防这个错误呢?
我也有看了有版友分享的关於浮点数的知识
但那好像跟我的情况又不太一样(或许只是我不了解)
目前卡在这个地方好久了...
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 122.126.50.45
1F:→ MOONRAKER:把每一步的各个变数印出来,看从什麽时候开始变成NaN 04/17 09:32
2F:→ MOONRAKER:NaN表示发生underflow,而一发生之後就会蔓延 04/17 09:33
3F:→ Peruheru:Underflow的话,有没有办法说在运算值舍弃过小的位数呢? 04/17 15:24
4F:→ Peruheru:有点像是floor函数的感觉,有大值就只取大值不管太小的 04/17 15:26
5F:→ Peruheru:小数 04/17 15:26
6F:→ Peruheru:我现在只能苟且的将里面造成溢位的元凶矩阵衰减 04/17 15:27
7F:→ Peruheru:然後才能无事模拟完500次 04/17 15:27
8F:→ Peruheru:但是我的衰减方式完全没有数学根据(因为不懂Kalman...) 04/17 15:27
9F:→ Peruheru:所以总觉得这样模拟出来的结果大概也不会对 04/17 15:28
10F:→ Peruheru:但是不衰减它就很容易大得不得了... 04/17 15:28
11F:→ MOONRAKER:小心是underflow不是overflow喔,underflow是说浮点数 04/17 16:33
12F:→ MOONRAKER:运算中产生低於目前有效位数的值,不过我也不清楚怎麽 04/17 16:33
13F:→ MOONRAKER:解决 X( 04/17 16:33