2016-05-10 52 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的一个因素!