मैं 64-बिट (हस्ताक्षरित) घन जड़ों के लिए तेज़ कोड ढूंढ रहा हूं। (मैं सी का उपयोग कर रहा हूं और जीसीसी के साथ संकलन कर रहा हूं, लेकिन मुझे लगता है कि अधिकांश काम आवश्यक भाषा-और कंपाइलर-अज्ञेयवादी होंगे।) मैं एक 64-बिट असीमित पूर्णांक के साथ इंगित करता हूं।इंटीजर क्यूब रूट
एक इनपुट को देखते हुए n मैं की आवश्यकता होती है ऐसी है कि
r * r * r <= n && n < (r + 1) * (r + 1) * (r + 1)
है कि, मैं n का घनमूल चाहते हो (अभिन्न) वापसी मान आर, पूर्णांक। मूल कोड जैसे
return (ulong)pow(n, 1.0/3);
सीमा के अंत की ओर घूमने के कारण गलत है।
ulong
cuberoot(ulong n)
{
ulong ret = pow(n + 0.5, 1.0/3);
if (n < 100000000000001ULL)
return ret;
if (n >= 18446724184312856125ULL)
return 2642245ULL;
if (ret * ret * ret > n) {
ret--;
while (ret * ret * ret > n)
ret--;
return ret;
}
while ((ret + 1) * (ret + 1) * (ret + 1) <= n)
ret++;
return ret;
}
सही परिणाम देता है, लेकिन इसकी तुलना में धीमी गति से असंगत कोड है।
यह कोड गणित पुस्तकालय के लिए है और इसे विभिन्न कार्यों से कई बार बुलाया जाएगा। गति महत्वपूर्ण है, लेकिन आप गर्म कैश पर भरोसा नहीं कर सकते हैं (इसलिए 2,642,245-एंट्री बाइनरी खोज जैसे सुझाव सही हैं)।
तुलना के लिए, यहां कोड है सही पूर्णांक वर्ग रूट की गणना करता है।
ulong squareroot(ulong a) {
ulong x = (ulong)sqrt((double)a);
if (x > 0xFFFFFFFF || x*x > a)
x--;
return x;
}
अपने "अव्यावहारिक" कार्यान्वयन की धीमी गति से भाग क्या है? क्या यह पाउ() कॉल या एक/दोनों लूप है? – RBarryYoung
पाउ कॉल महंगा है (~ 140 घड़ियों निर्देश गणना द्वारा)। शेष मुक्त नहीं है, हालांकि, विशेष रूप से शाखा गलतफहमी के साथ; यह 80 घड़ियों फैक्टरिंग की लागत है कि – Charles