[問題] 內積求夾角 計算精確度不足時

看板Programming作者 (兔子)時間13年前 (2010/11/12 11:03), 編輯推噓3(3015)
留言18則, 5人參與, 最新討論串1/1
兩向量(x,z) (x1,z1)求夾角 公式thita = cos^-1((x * x1 + z * z1) / (((x * x + z * z) * (x1 * x1 + z1 * z1))^0.5)); 但是當(x,z)=(-0.08, 9.7) (x1,z1)=(-0.08, 9.8)時 Math.acos裡的值會大於1 造成thita=NaN 請問這要怎麼解決呢? -- ◤ __ \__◢◤◢◤ ψhirabbitt ◤ ◢███◣ ◢███◣ 妳是我 █████ █████ 你是我 ██ ███ 最愛的寶貝 ██╱╲ ◥█████◣● 最寶貝的愛╱╱ ◥████ ˇ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 163.13.127.91

11/12 11:11, , 1F
你用float?改用double試試看囉
11/12 11:11, 1F

11/12 12:26, , 2F
加個判斷式, 超過值域範圍就調回來
11/12 12:26, 2F

11/12 16:40, , 3F
好 謝謝
11/12 16:40, 3F

11/12 22:49, , 4F
可以把程式碼放上來嗎 我用float還是正確
11/12 22:49, 4F

11/14 12:25, , 5F
我已經改寫了耶0.0>
11/14 12:25, 5F

11/14 12:25, , 6F
你這樣一說 搞不好真的是我也錯
11/14 12:25, 6F

11/14 12:26, , 7F
11/14 12:26, 7F

11/14 21:49, , 8F
你要不要先把向量先個別"正規化"
11/14 21:49, 8F

11/14 21:50, , 9F
就是各分量除以所屬向量的長度
11/14 21:50, 9F

11/14 21:54, , 10F
再直接將正規化後兩向量做內積就是cos值
11/14 21:54, 10F

11/14 21:55, , 11F
雖然我說的跟你的式子其實沒有分別
11/14 21:55, 11F

11/14 21:58, , 12F
但是這樣應該會準確許多...
11/14 21:58, 12F

11/19 14:18, , 13F
順序的問題?
11/19 14:18, 13F

11/20 11:07, , 14F
將這兩個向量除各自的長度變成單位向量
11/20 11:07, 14F

11/20 11:08, , 15F
再將這兩個單位向量直接內積就是cos值
11/20 11:08, 15F

11/20 11:15, , 16F
十進位小數轉成浮點數會產生誤差
11/20 11:15, 16F

11/20 11:16, , 17F
你的式子沒錯但會將轉換產生的誤差放大
11/20 11:16, 17F

11/20 11:42, , 18F
這只是我的想法 參考看看囉
11/20 11:42, 18F
文章代碼(AID): #1CtAvrAG (Programming)