2016-05-10 57 views
0

考慮一個直角三角形,其中您知道斜邊和導管之一 - 讓我們說一個與您感興趣的角度α相反的直角三角形。 值sin(alpha)可以作爲從正弦或反之亦然計算餘弦的性能和精度

sin(alpha) = a/c, 

容易地計算出與a是相反的直角和c斜邊。我不知道相鄰導管的長度b。計算cos(alpha)的速度和/或更準確的方法是什麼?

一種既可以使用

sin²(alpha) + cos²(alpha) = 1 
=> cos(alpha) = Sqrt(1 - sin²(alpha)), 

,你必須一次乘法,一個減法和一個平方根運算,或者

alpha = asin(a/c) 
=> cos(alpha) = cos(asin(a/c)), 

,你必須一個反正弦運算和餘弦操作(商a/c已被計算)。

我對這兩種方法的性能和準確性感興趣,並且如果可能有更好的方法。

+0

乘法和減法是基本操作。比其他方法快得多。所以第一種方法更快。準確性會相同。 –

+0

您似乎已經忘記了第一種方法中的平方根操作,那將會花費很多時間...... – Timitry

回答

2

我測試了在C#下面的代碼的性能,在覈心i7-6700 @ 3.40GHz,8 GB RAM,運行Windows 10和Visual Studio 2013:

var stopwatch = new Stopwatch(); 
    var random = new Random(); 

    var numberOfValues = 1000000; 
    var repetitions = 100; 
    var quotients = new double[numberOfValues]; 
    var sineValues = new double[numberOfValues]; 
    var results = new double[numberOfValues]; 


    // Preparing values for the measurement. 
    for (var i = 0; i < numberOfValues; i++) 
    { 
    quotients[i] = random.NextDouble()/random.NextDouble(); 
    sineValues[i] = Math.Sin(quotients[i]); 
    } 


    // First method: Squaring and taking square root. 
    stopwatch.Start(); 
    for (var j = 0; j < repetitions; j++) 
    { 
    for (var i = 0; i < numberOfValues; i++) 
    { 
     results[i] = Math.Sqrt(1 - Math.Pow(sineValues[i], 2)); 
    } 
    } 
    stopwatch.Stop(); 
    Console.WriteLine(stopwatch.Elapsed); 


    stopwatch.Reset(); 


    // Second method: Arcsine and cosine. 
    stopwatch.Start(); 
    for (var j = 0; j < repetitions; j++) 
    { 
    for (var i = 0; i < numberOfValues; i++) 
    { 
     results[i] = Math.Cos(Math.Asin(quotients[i])); 
    } 
    } 
    stopwatch.Stop(); 
    Console.WriteLine(stopwatch.Elapsed); 

結果:

04.7030170 sec 
10.4038198 sec, 

這只是兩個差異的因素。但是,如果Math.Pow被替換爲直接相乘,將值更改爲:

00.4991018 sec 
10.3393635 sec, 

其產生大約20的一個因素!