兩點之間的距離:最快的方法來計算兩個CGPoints之間的距離?
sqrt((x1-x2)^2 + (y1-y2)^2)
有沒有辦法在Objective-C這樣做數學更快?
編輯:我想我需要澄清以上。我寫了上面的公式來澄清我用什麼公式計算距離。 ^並不是要表示異或 - 我只是想表示數學公式而不使用像pow或其他任何函數,所以我打算使用^來「提升電源關閉」。我想知道是否有人知道如果使用按位運算符,或者在程序集中編寫代碼會給出優化版本。我在iPhone/iPad應用程序中使用公式。
兩點之間的距離:最快的方法來計算兩個CGPoints之間的距離?
sqrt((x1-x2)^2 + (y1-y2)^2)
有沒有辦法在Objective-C這樣做數學更快?
編輯:我想我需要澄清以上。我寫了上面的公式來澄清我用什麼公式計算距離。 ^並不是要表示異或 - 我只是想表示數學公式而不使用像pow或其他任何函數,所以我打算使用^來「提升電源關閉」。我想知道是否有人知道如果使用按位運算符,或者在程序集中編寫代碼會給出優化版本。我在iPhone/iPad應用程序中使用公式。
不,如果您需要準確的距離,您無法擊敗該公式。
雖然要清楚^不是用於平方值的運算符,而是用於執行xor的位運算符。
你會需要像
double dx = (x2-x1);
double dy = (y2-y1);
double dist = sqrt(dx*dx + dy*dy);
如果你可以只用方形生活(這是有用的,當你只是想這樣做的距離排序,你可以用更有效的
double dx = (x2-x1);
double dy = (y2-y1);
double dist = dx*dx + dy*dy;
這將至少爲解決戰俘一樣好。在最壞的情況,POW()將使用堆棧和效率較低,但也許你的編譯器把它變成X * X這種情況。
+1你可以確定'pow'至少比'*'長一個數量級,我不認爲編譯器可以優化'pow',因爲它不能確定它沒有被一個完全不同的稱爲'pow'的函數取代。 – 2012-02-03 00:54:50
另外,'hypot(dx,dy)'。 – 2014-08-13 13:40:32
double dist = sqrt (pow((x1-x2), 2) + pow((y1-y2), 2));
考慮x1, x2, y1, y2
是float
或double
或整數。
我不認爲通用指數函數(pow)計算正方形比簡單乘法要快。 – 2012-02-03 05:25:49
在Intel的Mac鏘將編譯:
double distance = ({double d1 = x1 - x2, d2 = y1 - y2; sqrt(d1 * d1 + d2 * d2); });
成總計6個指令的數學:子,MUL,子,MUL,添加,SQRT;很難打敗。 (sqrt是單個指令,但需要多個週期)。
關於這裏可以改進的唯一的東西是平方根計算函數。
我已經試過這兩個功能(在Wikipedia article on square root computation找到)來計算近似平方根值:
float fsqrt(float x)
{
float xhalf = 0.5f * x;
union
{
float x;
int i;
} u;
u.x = x;
u.i = 0x5f3759df - (u.i >> 1);
x *= u.x * (1.5f - xhalf * u.x * u.x);
return x;
}
float fsqrt2(float z)
{
union
{
int tmp;
float f;
} u;
u.f = z;
/*
* To justify the following code, prove that
*
* ((((val_int/2^m) - b)/2) + b) * 2^m = ((val_int - 2^m)/2) + ((b + 1)/2) * 2^m)
*
* where
*
* val_int = u.tmp
* b = exponent bias
* m = number of mantissa bits
*
* .
*/
u.tmp -= 1 << 23; /* Subtract 2^m. */
u.tmp >>= 1; /* Divide by 2. */
u.tmp += 1 << 29; /* Add ((b + 1)/2) * 2^m. */
return u.f;
}
但在我的酷睿2奔騰CPU,他們似乎並不比更快的x87 FPU FSQRT
指令。看看他們的工作是否比平臺上的標準sqrtf()/sqrt()
快,並且準確度足夠。
只是提供這個作爲一個簡單,漂亮的解決方案。這很可能不會比以前給出的更快,只是更短。我個人正在使用hypot
。
double dist = hypot((x1-x2), (y1-y2));
根據docs,這會返回「平方根(x^2 + y^2)」。
比什麼快? – 2012-02-02 12:11:00
我只是想知道如果有人知道執行這種計算的最快方法。通常我只是寫出公式並使用pow或其他東西,但我不知道使用*還是使用按位運算符會產生更快的結果。 – xcoder 2012-02-03 04:32:21