Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VB.net中余弦定律的优化_Vb.net_Math_Optimization_Trigonometry - Fatal编程技术网

VB.net中余弦定律的优化

VB.net中余弦定律的优化,vb.net,math,optimization,trigonometry,Vb.net,Math,Optimization,Trigonometry,我在程序中使用了余弦定律,这似乎是我代码中的一个慢点。这是我的代码行: Ans = Math.Sqrt(A ^ 2 + B ^ 2 - 2 * A * B * Math.Cos(C - D)) 其中A到D是每次调用时都会更改的双变量。这个函数似乎需要大约2000个滴答声才能运行。我已经研究过使用小角度近似,如果(C-D)足够小,可以使用cos(C-D)=1-((C-D)^2)/2。不幸的是,这最终证明比原始代码总体上要慢。我研究过任何一种可以简化计算的关系,但是A和C是以复杂的方式关联的,B和

我在程序中使用了余弦定律,这似乎是我代码中的一个慢点。这是我的代码行:

Ans = Math.Sqrt(A ^ 2 + B ^ 2 - 2 * A * B * Math.Cos(C - D))
其中A到D是每次调用时都会更改的双变量。这个函数似乎需要大约2000个滴答声才能运行。我已经研究过使用小角度近似,如果(C-D)足够小,可以使用cos(C-D)=1-((C-D)^2)/2。不幸的是,这最终证明比原始代码总体上要慢。我研究过任何一种可以简化计算的关系,但是A和C是以复杂的方式关联的,B和D也是以同样的方式关联的,A和B之间或者C和D之间没有关系

我曾考虑对(C-D)的所有值使用一个查找函数,但我的精度目前至少为6位有效数字,我更愿意保持在这个水平,因为这是我输入数据的精度,简而言之,这意味着查找中大约有一百万个变量,这只是函数的一部分。我曾考虑查找所有四个值(a、B、C和D),但我不确定如何实现

我也已经对这个应用程序进行了多线程处理,并尝试使用GPGPU(GPGPU由于在加载GPU内存和从GPU内存中加载所花费的时间而变得较慢)

所以,我的问题是如何加速这个函数


提前感谢

以下运行时间不到1/3

ans=Math.Sqrt(a*a+b*b-2*a*b*Math.Cos(c-d))

下面是证明这一点的代码:

    Dim sw1 As New Stopwatch
    Dim sw2 As New Stopwatch

    Dim ans, a, b, c, d As Double
    a = 5
    b = 10
    c = 4
    d = 2

    sw1.Start()
    For x As Integer = 1 To 10000
        ans = Math.Sqrt(a ^ 2 + b ^ 2 - 2 * a * b * Math.Cos(c - d))
    Next
    sw1.Stop()

    sw2.Start()
    For y As Integer = 1 To 10000
        ans = Math.Sqrt(a * a + b * b - 2 * a * b * Math.Cos(c - d))
    Next
    sw2.Stop()

    Console.WriteLine(sw1.ElapsedTicks)
    Console.WriteLine(sw2.ElapsedTicks)

    Console.WriteLine(sw2.ElapsedTicks * 100 / sw1.ElapsedTicks)

变量的类型是什么?如果你使用decmal,你会看到一个减速。