跳转到内容

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)


上一节: 入门 目录 下一节: 分支
华夏公益教科书