使用餘弦定理計算反三角函數卻報超出定義域

使用math.acos計算反三角函數卻報超出定義域

1.ERROR

項目裏出錯的截圖找不到了,就用一個示例吧。
在這裏插入圖片描述

如上,arccos裏面的數應該是[-1, 1],理論上來說,三個點組成的三角形計算的話都應該符合這個條件,即使是三個點跑到一條直線上了。

但是,有時候你還會在實際項目中碰到這種情況,那是爲什麼呢?

2.分析

在實際中,比如視覺方向,一張圖像中你檢測出的各個點可能在任意一個位置,即便在任意一個位置你的代碼也應該能夠正常運行。就是因爲位置太任意,導致下面的公式計算出來可能不是一個有理數,這樣一來,勢必在要進行約去或者進位或者說在計算機上轉化爲二進制的時候轉化的不是原數(這方面我也不是很清楚)。這樣一來就造成了該值大於1或者小於-1(雖然只是大了很小很小一點點),進而出現超出函數定義域的情況。
在這裏插入圖片描述
這種情況可能很難想到,因爲理論上不會出現這種情況的,但在實際中,任何情況都有可能發生。

3.解決

def norm(x):
        if x < -1:
            return -1
        elif x > 1:
            return 1
        else:
            return x
    
cos_A = norm((length_b ** 2 + length_c ** 2 - length_a ** 2) / (2 * length_b * length_c))
cos_B = norm((length_a ** 2 + length_c ** 2 - length_b ** 2) / (2 * length_a * length_c))
cos_C = norm((length_a ** 2 + length_b ** 2 - length_c ** 2) / (2 * length_a * length_b))

print(cos_A, cos_B, cos_C)
angle_A = (math.acos(cos_A)) / pi * 180
angle_B = (math.acos(cos_B)) / pi * 180
angle_C = (math.acos(cos_C)) / pi * 180
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章