跳轉到內容

Visual Basic/簡單算術

來自華夏公益教科書,開放的書籍,面向開放的世界

Visual Basic 擁有所有常見的算術函式。它沒有複數,也不允許你過載運算子,因此必須透過顯式函式和子例程呼叫來操作複數或矩陣。

算術運算子

[編輯 | 編輯原始碼]

運算子是中綴運算子,接受兩個引數:arg1 運算子 arg2,除了單目加號和減號

數字運算子

[編輯 | 編輯原始碼]
運算子 註釋
+ 將兩個數字相加。也可以連線字串,但避免使用此用法,因為 Visual Basic 會先嚐試將字串轉換為數字,結果可能並非你預期的。
- 從第一個數字中減去第二個數字。
- 單目 對運算元取反。
* 將兩個數字相乘。如果其中一個數字已經是該型別,則結果將提升到任何表示數字大小所需的任何資料型別(參見下面關於奇怪行為的說明)。
/ 普通除法。將兩個運算元都視為實數並返回實數結果。
\ 整數除法。小心使用它,因為在執行除法之前會將引數轉換為整數,因此除非你仔細註釋程式碼,否則請將其與整數運算元一起使用。

另外請注意,“/”和“*”在“\”之前進行評估,因此 (1000 \ 13 * 3) 不等於 ( (1000 \ 13) * 3)

Mod 產生整數除法後的餘數。小心使用它,因為模運算子在數學中的解釋是不明確的。a Mod b給出與以下表達式相同的答案a - (a \ b) * b
^ 將第一個運算元提升到第二個運算元的冪。在 Visual Basic 中,一個或兩個運算元都可以為負數。如果你只想要平方或立方,則顯式將數字乘以自身相應次數更快。

例如

Text2 = Text1 * 5

將在 Text2 中顯示 Text1 中的值乘以 5。例如,如果 Text1 = 4,則 Text2 將等於 20。

運算順序

[編輯 | 編輯原始碼]
  • 冪運算(^)
  • 乘法和普通除法(* 和 /)
  • 整數除法(\)
  • 模(Mod)
  • 加法和減法(+,-)

一般提示:如果表示式使用多個 (+, -, *),則使用所有可能的括號強制表示式按你期望的方式進行評估。

VB 奇怪行為注意

[編輯 | 編輯原始碼]

VB 將“顯式宣告的”整數視為 Integer 型別(必須介於 -32768 和 32767 之間),如果它們在 (-32768, +32767) 之間,並且如果它們的算術結果大於 32768,則會報錯。這可以透過嘗試以下操作來觀察

Debug.Print (17000 + 17000)

或者

Debug.Print (17000 * 3)

這兩者都會導致錯誤。這可以透過(以一種直接但難看的方式)將數字包含在 CLng()(轉換為 Long)中來解決,因此

Debug.Print (CLng(17000) + CLng(17000))

或者使用型別宣告字元 & 來指定一個 Long 常量

Debug.Print (17000& + 17000&)

都不會導致錯誤。為了避免必須考慮這一點,請避免在程式碼中使用顯式數字,而是使用諸如“Long”變數和常量

  Const TEST_NUM As Long = 17000&
  Debug.Print (TEST_NUM + TEST_NUM)
  
  Dim TestNumVar As Long
  TestNumVar = 17000
  Debug.Print (TestNumVar + TestNumVar)

布林算術

[編輯 | 編輯原始碼]

布林運算子 使用布林變數或整數變數,其中每個單獨的位都作為布林值對待。有六個運算子

運算子 意義
Not 否定
And 合取
Or 析取(邏輯加法)
Xor 異或
Eqv 等價
Imp 蘊涵

當你使用這些運算子構造邏輯表示式時,你會得到以下結果

A B A And B A Or B A Xor B A Eqv B A Imp B
T T T T F T T
T F F T T F F
F T F T T F T
F F F F F T T

比較運算子

[編輯 | 編輯原始碼]

這些運算子由 <,> 和 = 組成,用於確定一個值是否小於、大於或等於另一個值。

例如

  Dim i
  i = 50
  If i < 0 Then
      MsgBox "i is less than 0" 
  ElseIf i <= 100 And i >= 0 Then
      MsgBox "i is less than or equal to one hundred and greater than or equal to 0"
  ElseIf i > 100 And i < 200 Then
      MsgBox "i is greater than one hundred less than 200"
  Else
      MsgBox "i is greater than or equal to 200"
  End if

注意!由於浮點數(Single 和 Double)的內部結構,請勿使用 = 或 <> 來比較它們。相反,請使用一個較小的值(通常稱為 Epsilon)作為“最大差值”。例如

  ' This returns False :
  Debug.Print (Sqr(1.234) * Sqr(1.234)) = 1.234
  ' This returns True :
  E = 0.000001
  Debug.Print Abs((Sqr(1.234) * Sqr(1.234)) - 1.234) < E
運算子 意義
= 相等
<> 不相等
< 小於
> 大於
>= 大於或等於。換句話說,不小於
<= 小於或等於。換句話說,不大於

內建算術函式

[編輯 | 編輯原始碼]

Visual basic 中沒有太多本機數學函式,但這並不意味著你不能用它進行重要的計算。

Abs(x)
返回 x 的絕對值,即如果存在,則刪除減號。示例:Abs(3)=3 ; Abs(-3)=3
Exp(x)
返回 ex 的值。e 是尤拉常數,是自然對數的底。
Log(x)
奈皮爾('自然',e 底)對數 of x
Randomize(x)
實際上不是一個數學函式,因為它實際上是一個子例程。這將初始化隨機數生成器。
Rnd(x)
生成序列中的下一個隨機數。請再讀一遍這句話!隨機數實際上不是隨機的,而是偽隨機的。如果你每次啟動程式時都用相同的數字初始化隨機數生成器,那麼你將從 Rnd() 中獲得相同的系列值
Round(x,n)
返回四捨五入到 n 小數位數的實數(使用銀行家舍入)。
Sgn(x)
如果 x 為正,則返回 1,如果 x 為負,則返回 -1,如果 x 嚴格等於 0,則返回 0。Sgn(-5)=-1 ; Sgn(5)=1 ; Sgn(0)=0
Sqr(x)
x 的平方根。示例:Sqr(25)=5。x 必須是非負的。因此 Sqr(-25) 會產生錯誤

派生函式

[編輯 | 編輯原始碼]

如果你想要以其他底數為底的對數,你可以使用以下表達式

Log(x, base) = Log(x) / Log(base)

並計算一個數字的 n 次根(立方根,...)

RootN(x, n) = x ^ (1.0 / n)

三角函式

[編輯 | 編輯原始碼]

Visual Basic 擁有常用的簡單三角函式,sin、cos、tan,但如果你想要一些更不常見的函式或反函式,則需要編寫一些簡單的函式。

請記住,角度必須以弧度給出

  radians = degrees * pi / 180

  ArcSin(x) = Atn(x / Sqr(-x * x + 1))

  ArcCos(x) = Atn(-x / Sqr(-x * x + 1)) + 2 * Atn(1)

請注意,這些表示式的適用範圍僅限於 -1<=x<=1 範圍。

這裡還有一些

正割 Sec(x) = 1 / Cos(x)
餘割 Cosec(x) = 1 / Sin(x)
餘切 Cotan(x) = 1 / Tan(x)
反正弦 Arcsin(x) = Atn(x / Sqr(-x * x + 1))
反餘弦 Arccos(x) = Atn(-x / Sqr(-x * x + 1)) + 2 * Atn(1)
反正割 Arcsec(x) = Atn(x / Sqr(x * x - 1)) + Sgn((x) - 1) * (2 * Atn(1))
反餘割 Arccosec(x) = Atn(x / Sqr(x * x - 1)) + (Sgn(x) - 1) * (2 * Atn(1))
反餘切 Arccotan(x) = -Atn(x) + 2 * Atn(1)
雙曲正弦 HSin(x) = (Exp(x) - Exp(-x)) / 2
雙曲餘弦 HCos(x) = (Exp(x) + Exp(-x)) / 2
雙曲正切 HTan(x) = (Exp(x) - Exp(-x)) / (Exp(x) + Exp(-x))
雙曲正割 HSec(x) = 2 / (Exp(x) + Exp(-x))
雙曲餘割 HCosec(x) = 2 / (Exp(x) - Exp(-x))
雙曲餘切 HCotan(x) = (Exp(x) + Exp(-x)) / (Exp(x) - Exp(-x))
反雙曲正弦 HArcsin(x) = Log(x + Sqr(x * x + 1))
反雙曲餘弦 HArccos(x) = Log(x + Sqr(x * x - 1))
反雙曲正切 HArctan(x) = Log((1 + x) / (1 - x)) / 2
反雙曲正割 HArcsec(x) = Log((Sqr(-x * x + 1) + 1) / x)
反雙曲餘割 HArccosec(x) = Log((Sgn(x) * Sqr(x * x + 1) + 1) / x)
反雙曲餘切 HArccotan(x) = Log((x + 1) / (x - 1)) / 2

非常有用的 atan2 函式(計算向量在所有四個象限中的角度)可以這樣模擬

 Public Const Pi As Double = 3.14159265358979
  
  Public Function Atan2(ByVal y As Double, ByVal x As Double) As Double
  
    If y > 0 Then
      If x >= y Then
        Atan2 = Atn(y / x)
      ElseIf x <= -y Then
        Atan2 = Atn(y / x) + Pi
      Else
        Atan2 = Pi / 2 - Atn(x / y)
      End If
    Else
      If x >= -y Then
        Atan2 = Atn(y / x)
      ElseIf x <= y Then
        Atan2 = Atn(y / x) - Pi
      Else
        Atan2 = -Atn(x / y) - Pi / 2
      End If
    End If

  End Function

其他函式

  ASin(x) = Atan2(x, Sqr(1 - x * x))
  ACos(x) = Atan2(Sqr(1 - x * x), x)


上一節: 入門 目錄 下一節: 分支
華夏公益教科書