如何实现arcsin函数(定义如下)的VBA代码?
定义:反正弦函数是正弦函数的反函数。它返回正弦为给定数字的角度。对于每个三角函数,都有一个相反的反函数。这些反函数具有相同的名称,但前面带有“arc”。 (在某些计算器上,反正弦按钮可能被标记为 asin,有时也被标记为 sin-1。)因此,sin 的倒数是 arcsin 等。当我们看到“反正弦 A”时,我们将其理解为“sin 为 A 的角度”
sin30 = 0.5 意思是:30度的正弦值为0.5
arcsin 0.5 = 30 意思是:sin 为 0.5 的角度是 30 度。
我不太明白你的问题。 VBA 中已经存在 arcsin 函数,您可以使用它:
WorksheetFunction.Asin(myValue)
反正弦函数的使用
Dim myValue As Double
myValue = 0.1234
MsgBox CStr(WorksheetFunction.Asin(myValue))
您可以在其中打印 Double 值的 arcsin 函数的结果。
WorksheetFunction.ASIN 比 VBA 版本慢 4.7 倍。
(另外,在 Excel VBA 帮助中搜索“派生数学函数”。)
我使用 kernal32 函数“QueryPerformanceCounter()”和“QueryPerformanceFrequency()”在 Excel 2010 中进行了速度比较。 我很好奇新版本是否会产生不同的结果。
这是我测试的函数(检查以避免 #DIV/0! 错误):
Public Function ASin( _
ByVal x As Double _
) As Double
Const PIover2 As Double = 1.5707963267949
If (x = 1) Then
ASin = PIover2
ElseIf (x = -1) Then
ASin = -PIover2
Else
ASin = Atn(x / Sqr(-x * x + 1))
End If
End Function
我使用 10,000,000 次迭代测试了该函数,以不同的顺序和组调用这两个函数,以考虑任何“启动井”效应(我想)。 (您可以在下面看到我调用了 VBA 函数 10M 次,然后调用了 WorksheetFunction 10M 次两次,等等) 以下是速度测试结果:
'WorksheetFunction is about 4.7 times slower than VBA
' VBA(1) WSF(1) WSF(2) VBA(2) VBA(3) WSF(3) WSF/VBA
' 1.983 9.383 9.377 1.968 1.976 9.410 4.753
以下代码将有助于根据给定的定义实现 ARCSIN 函数:
Option Explicit
Public Const Pi As Double = 3.14159265358979
Private Function ArcSin(X As Double) As Double
If Abs(X) = 1 Then
'The VBA Sgn function returns an integer (+1, 0 or -1),
'representing the arithmetic sign of a supplied number.
ArcSin = Sgn(X) * Pi / 2
Else
'Atn is the inverse trigonometric function of Tan,
'which takes an angle as its argument and returns
'the ratio of two sides of a right triangle
ArcSin = Atn(X / Sqr(1 - X ^ 2))
End If
End Function
Public Function Math_asin(x As Double) As Double
If x = 1 Then
Math_asin = PI / 2
ElseIf x = -1 Then
Math_asin = -PI / 2
Else
Math_asin = 2 * Atn(x / Sqrt(1 - x * x))
End If
结束功能