[.NET] 浮點數變成1.#QNAN的樣子了

看板Visual_Basic作者 (還在想)時間16年前 (2009/04/16 23:12), 編輯推噓0(0013)
留言13則, 2人參與, 最新討論串1/1
請輸入專案類型(網站專案或者應用程式專案):應用程式專案 這是延續我之前問的那幾個問題的程式 我有用VB來算矩陣的加減乘法運算(後來做的,是不可或缺的部分) 不曉得有沒有人看過我在Ask版也問過的,關於Kalman濾波器 我在做的就是這個東西 到頭來我還是不瞭解原理,只能照著給我的規格流程來做 我做的這個東西分成兩個部分 一部分是模擬系統,一部分是參數預測(這部分就是Kalman濾波器負責的) 先丟一組預設的參數給模擬系統 模擬系統模擬完後的狀態丟給Kalman Kalman進行運算後得到新的參數再丟給模擬系統來做模擬 模擬系統的部分我大致完成了 但是產生新的參數時 大概在第60幾次左右會使得參數矩陣變成1.#QNAN這個值(型態是Double) 然後就會發生錯誤,因為這個值不能拿來運算 (但是很奇怪,產生這個數時卻沒有告訴我有錯誤) 我搜尋了一下都沒看到什麼可用的說明 只大概知道這是表示「浮點數的小數部分非實數」或是類似得概念 但是我覺得很奇怪 這個Kalman的運算中,只有乘法,加法,和減法的運算(雖然是矩陣的) 不管怎麼說,非實數這種東西不是要負數開根號才會出現嗎? 我的運算中,矩陣的內容完全沒有任何地方有開根號 那請問怎麼會出現這種錯誤呢? 我偵錯功力不夠好 對於這個濾波器又不瞭解 我實在無法理解為何簡單的加減乘除運算會產生非實數的結果 我這個運算又有亂數影響,導致每次出現錯誤的點都有點不同 沒辦法鎖定是第幾次一定會出錯 想請問這個錯誤有可能有其他途徑產生嗎? 我又要如何預防這個錯誤呢? 我也有看了有版友分享的關於浮點數的知識 但那好像跟我的情況又不太一樣(或許只是我不瞭解) 目前卡在這個地方好久了... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.126.50.45

04/17 09:32, , 1F
把每一步的各個變數印出來,看從什麼時候開始變成NaN
04/17 09:32, 1F

04/17 09:33, , 2F
NaN表示發生underflow,而一發生之後就會蔓延
04/17 09:33, 2F

04/17 15:24, , 3F
Underflow的話,有沒有辦法說在運算值捨棄過小的位數呢?
04/17 15:24, 3F

04/17 15:26, , 4F
有點像是floor函數的感覺,有大值就只取大值不管太小的
04/17 15:26, 4F

04/17 15:26, , 5F
小數
04/17 15:26, 5F

04/17 15:27, , 6F
我現在只能苟且的將裡面造成溢位的元凶矩陣衰減
04/17 15:27, 6F

04/17 15:27, , 7F
然後才能無事模擬完500次
04/17 15:27, 7F

04/17 15:27, , 8F
但是我的衰減方式完全沒有數學根據(因為不懂Kalman...)
04/17 15:27, 8F

04/17 15:28, , 9F
所以總覺得這樣模擬出來的結果大概也不會對
04/17 15:28, 9F

04/17 15:28, , 10F
但是不衰減它就很容易大得不得了...
04/17 15:28, 10F

04/17 16:33, , 11F
小心是underflow不是overflow喔,underflow是說浮點數
04/17 16:33, 11F

04/17 16:33, , 12F
運算中產生低於目前有效位數的值,不過我也不清楚怎麼
04/17 16:33, 12F

04/17 16:33, , 13F
解決 X(
04/17 16:33, 13F
文章代碼(AID): #19vqhKZg (Visual_Basic)