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 將“顯式宣告的”整數視為 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)
| 上一節: 入門 | 目錄 | 下一節: 分支 |