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,你会看到一个减速。