यह सिर्फ मेरी अपनी जिज्ञासा को संतुष्ट करने के लिए है।
क्या इसका कार्यान्वयन है:
float InvSqrt (float x)
{
float xhalf = 0.5f*x;
int i = *(int*)&x;
i = 0x5f3759df - (i>>1);
x = *(float*)&i;
x = x*(1.5f - xhalf*x*x);
return x;
}
जंग में? यदि यह मौजूद है, तो कोड पोस्ट करें।
मैंने इसे आजमाया और असफल रहा। मुझे नहीं पता कि पूर्णांक प्रारूप का उपयोग करके फ्लोट संख्या को कैसे एनकोड करना है। यहाँ मेरा प्रयास है:
fn main() {
println!("Hello, world!");
println!("sqrt1: {}, ",sqrt2(100f64));
}
fn sqrt1(x: f64) -> f64 {
x.sqrt()
}
fn sqrt2(x: f64) -> f64 {
let mut x = x;
let xhalf = 0.5*x;
let mut i = x as i64;
println!("sqrt1: {}, ", i);
i = 0x5f375a86 as i64 - (i>>1);
x = i as f64;
x = x*(1.5f64 - xhalf*x*x);
1.0/x
}
संदर्भ:
1. क्वेक 3 के फास्ट इनवस्कर्ट की उत्पत्ति () - पेज 1
2. क्वेक के फास्ट इनवर्स स्क्वायर रूट को समझना
3. फास्ट इन्वर्टर वर्ग ROOT.pdf
4. स्रोत कोड: q_math.c # L552-L572
union
।
union
काम करता है। memcpy
निश्चित रूप से काम करता है, हालांकि यह क्रिया है।
rsqrtss
और rsqrtps
निर्देश, 1999 में पेंटियम III के साथ पेश किए गए, इस कोड की तुलना में अधिक तेज़ और सटीक हैं। ARM NEON vrsqrte
जो समान है और जो कुछ भी गणना III के लिए इस्तेमाल की जाती है वह शायद इन दिनों GPU पर शायद वैसे भी किया जाएगा।