2010-12-03 8 views
7

में फ्लोट के स्क्वायर रूट की गणना कैसे करें में में वर्ग की रूट की गणना कैसे कर सकते हैं, एक्सएनए में Core.Sqrt के समान?सी #

+1

शक्तिशाली जादू का उपयोग करें - [0x5f3759df] (http://www.codemaestro.com/reviews/9) – jball

+0

जादू व्युत्क्रम वर्ग-जड़ है यही कारण है कि। लेकिन समान जादू sqrt के लिए मौजूद है। और यह परिशुद्धता खो देता है। – CodesInChaos

+0

@CodeInChaos - लेख में दूसरे कोड नमूने में sqrt के लिए एक कार्यान्वयन है: * "ध्यान दें कि केवल वास्तविक अंतर वापसी मूल्य में है - वाई लौटने के बजाय, वर्ग संख्या के रूप में वापसी संख्या * y" * – jball

उत्तर

15

double के लिए इसकी गणना करें और फिर फ़्लोट पर वापस डालें। थोड़ा धीमा हो सकता है, लेकिन काम करना चाहिए।

(float)Math.Sqrt(inputFloat) 
+0

क्या यह सटीक ढीला नहीं है? – Chris

+0

मैंने हमेशा आशा की है कि किसी भी तरह .Net इसे दृश्यों के पीछे एक अखिल-फ्लोट (सभी 32-बिट) ऑपरेशन के रूप में अनुकूलित करेगा। क्या किसी को पता है कि यह अनुकूलित हो जाता है? – Detmar

+0

@ क्रिस, सटीकता इनपुट के समान ही होगी। गणना युगल का उपयोग कर किया जाता है। –

0
var result = Math.Sqrt((double)value); 
+1

फ्लोट और डबल गणना अलग-अलग नहीं? – Chris

+2

@Chris - Math.qrt विधि एक डबल लेता है और एक डबल देता है। यही कारण है कि मैंने पैरामीटर को डबल के रूप में डाला। –

+0

मैं इसे देखता हूं। लेकिन मैं फ्लोट्स के बारे में बात कर रहा हूं। धन्यवाद वैसे भी – Chris

4

यह कहना नफरत है, लेकिन 0x5f3759df रूप में लंबे समय के रूप में Math.Sqrt 3x लेने के लिए लगता है। मैंने टाइमर के साथ कुछ परीक्षण किया है। पूर्व-गणना वाले सरणी तक पहुंचने वाले फॉर-लूप में Math.Sqrt के परिणामस्वरूप लगभग 80ms का परिणाम हुआ। 0x5f3759df उसी परिस्थितियों में 180 + एमएस

परीक्षण रिलीज मोड अनुकूलन का उपयोग करके कई बार आयोजित किया गया था।

नीचे स्रोत:

/* 
    ================ 
    SquareRootFloat 
    ================ 
    */ 
    unsafe static void SquareRootFloat(ref float number, out float result) 
    { 
     long i; 
     float x, y; 
     const float f = 1.5F; 

     x = number * 0.5F; 
     y = number; 
     i = *(long*)&y; 
     i = 0x5f3759df - (i >> 1); 
     y = *(float*)&i; 
     y = y * (f - (x * y * y)); 
     y = y * (f - (x * y * y)); 
     result = number * y; 
    } 

    /* 
    ================ 
    SquareRootFloat 
    ================ 
    */ 
    unsafe static float SquareRootFloat(float number) 
    { 
     long i; 
     float x, y; 
     const float f = 1.5F; 

     x = number * 0.5F; 
     y = number; 
     i = *(long*)&y; 
     i = 0x5f3759df - (i >> 1); 
     y = *(float*)&i; 
     y = y * (f - (x * y * y)); 
     y = y * (f - (x * y * y)); 
     return number * y; 
    } 

    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
     int Cycles = 10000000; 
     Random rnd = new Random(); 
     float[] Values = new float[Cycles]; 
     for (int i = 0; i < Cycles; i++) 
      Values[i] = (float)(rnd.NextDouble() * 10000.0); 

     TimeSpan SqrtTime; 

     float[] Results = new float[Cycles]; 

     DateTime Start = DateTime.Now; 

     for (int i = 0; i < Cycles; i++) 
     { 
      SquareRootFloat(ref Values[i], out Results[i]); 
      //Results[i] = (float)Math.Sqrt((float)Values[i]); 
      //Results[i] = SquareRootFloat(Values[i]); 
     } 

     DateTime End = DateTime.Now; 

     SqrtTime = End - Start; 

     Console.WriteLine("Sqrt was " + SqrtTime.TotalMilliseconds.ToString() + " long"); 
     Console.ReadKey(); 
    } 
} 
+3

ईमानदार होने के लिए, यह बहुत दूर विषय लगता है, लेकिन वैसे भी दिलचस्प है! – Tara

+1

http://stackoverflow.com/questions/268853/is-it-possible-to-write-quakes-fast-invsqrt-function-in-c? –

-3
private double operand1; 

private void squareRoot_Click(object sender, EventArgs e) 
{ 
    operand1 = Math.Sqrt(operand1); 
    this.textBox1.Text = operand1.ToString(); 
} 
+2

स्टैक ओवरफ़्लो में आपका स्वागत है! हालांकि यह उत्तर शायद सही और उपयोगी है, यदि आप [इसके साथ कुछ स्पष्टीकरण शामिल करते हैं] (http://meta.stackexchange.com/q/114762/159034) यह समझाने के लिए कि यह समस्या को हल करने में कैसे मदद करता है, इसे प्राथमिकता दी जाती है। यह भविष्य में विशेष रूप से उपयोगी हो जाता है, यदि कोई परिवर्तन (संभावित रूप से असंबंधित) है जो इसे काम करना बंद कर देता है और उपयोगकर्ताओं को यह समझने की आवश्यकता होती है कि यह एक बार कैसे काम करता है। –