作者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
→ MOONRAKER:把每一步的各個變數印出來,看從什麼時候開始變成NaN 04/17 09:32
→ MOONRAKER:NaN表示發生underflow,而一發生之後就會蔓延 04/17 09:33
→ Peruheru:Underflow的話,有沒有辦法說在運算值捨棄過小的位數呢? 04/17 15:24
→ Peruheru:有點像是floor函數的感覺,有大值就只取大值不管太小的 04/17 15:26
→ Peruheru:小數 04/17 15:26
→ Peruheru:我現在只能苟且的將裡面造成溢位的元凶矩陣衰減 04/17 15:27
→ Peruheru:然後才能無事模擬完500次 04/17 15:27
→ Peruheru:但是我的衰減方式完全沒有數學根據(因為不懂Kalman...) 04/17 15:27
→ Peruheru:所以總覺得這樣模擬出來的結果大概也不會對 04/17 15:28
→ Peruheru:但是不衰減它就很容易大得不得了... 04/17 15:28
→ MOONRAKER:小心是underflow不是overflow喔,underflow是說浮點數 04/17 16:33
→ MOONRAKER:運算中產生低於目前有效位數的值,不過我也不清楚怎麼 04/17 16:33
→ MOONRAKER:解決 X( 04/17 16:33