如何在VBA中计算/定义ArcSin函数?

问题描述 投票:0回答:4

如何实现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 excel trigonometry
4个回答
3
投票

我不太明白你的问题。 VBA 中已经存在 arcsin 函数,您可以使用它:

WorksheetFunction.Asin(myValue)

反正弦函数的使用

Dim myValue As Double
myValue = 0.1234

MsgBox CStr(WorksheetFunction.Asin(myValue))

您可以在其中打印 Double 值的 arcsin 函数的结果。


2
投票

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

2
投票

以下代码将有助于根据给定的定义实现 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

0
投票
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

结束功能

© www.soinside.com 2019 - 2024. All rights reserved.