2011-03-23 25 views
7

我被預先計算一些三角-funnctions在一個表,字段優化查詢時,我無意中發現了這一點:MySQL的錯誤? (三角)

SELECT 6371 * acos(0.793521289617132 * 0.793521289617132 + 0.608542490648241 * 0.608542490648241 * cos(0.235244203230056 - 0.235244203230056)) 

返回null

與非預先計算值的查詢:

SELECT 6371 * acos(sin(radians(52.51581)) * sin(radians(52.51581)) + cos(radians(52.51581)) * cos(radians(g.lat)) * cos(radians(13.4785) - radians(13.4785))) 

返回0(這是正確的結果)

這是一個錯誤?還是預期?

回答

6

之前做一些簡化你有一些舍入誤差在你的查詢中由float算術得到結果。

如果您嘗試此查詢

SELECT -1 + (0.793521289617132 * 0.793521289617132 + 0.608542490648241 * 0.608542490648241 * cos(0.235244203230056 - 0.235244203230056)) 

你會得到6.66133814775094e-016。所以,你現在要做的是

SELECT 6371 * acos(1 + 6.66133814775094e-016) 

這顯然是行不通的,因爲acos只在[-1,1]域中定義。

我不知道你到底想要完成什麼,但你必須重新計算,例如,檢查acos的參數是否超出範圍,然後相應地設置該值,可能是這樣的:

ACOS(IF(val BETWEEN -1 AND 1, val, SIGN(val)) 
+0

謝謝,這很有道理! (我正在計算大圓距) – Dexter 2011-03-23 22:10:59

4

ACOS返回NULL,如果X不爲在範圍-1到1

可以與非預先計算值的情況下,MySQL是施加ACOS

+0

這似乎是這種情況,謝謝! – Dexter 2011-03-23 22:10:19