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)
上一节: 入门 | 目录 | 下一节: 分支 |