數學工具模組

檢查某個位元值
變數轉16進位
求取質數
高斯消去法
位元組轉 16 進位
變數轉位元組
2 進位轉變數
位元組轉變數
自訂傳回物件記憶體位置
以高斯消去法解反矩陣
兩矩陣相乘
轉換成其他 Variant 型態
進階階梯函數
16進位轉變數
Big Endian 與 Little Endian 互轉
變數轉 2 進位
16 進位轉位元組
位元組轉 2 進位
2 進位轉位元組
自訂傳回變數型態
傳回特別數學值
傳回轉置矩陣
其他進制轉換成其他 Variant 型態

檢查某個位元值CheckSingleBit 傳回某個位元值的真偽, 1 傳回真 (True), 0 傳回偽 (False)

引數 型態 說明
wFlags 長整數 欲檢查的旗標
Check 長整數 欲檢查位元的位置,由右方向左數,值域為 1 ~ 32

範例以 2924 為例,其二進位值為 "101101101100"

範例 傳回值 說明
CheckSingleBit(2924,1) False 2924 的二進位值第一位 (最右方) 為 0
CheckSingleBit(2924,2) False 2924 的二進位值第二位為 0
CheckSingleBit(2924,3) True 2924 的二進位值第三位為 1
CheckSingleBit(2924,12) True 2924 的二進位值第 12 位 (最左方) 為 1

進階階梯函數

任意基底階梯函數:CValue(SourceValue, Bios, wFlags, Base)

說明:在中央遙測中心所購買的數值高程資料為每 40 公尺一個高程資料,需要發展本函數以求得任意點四周的控制點座標

引數 類型 說明
SourceValue 必要 來源引數
Bios 可省略 階梯函數的間距,預設值為 1
wFlags 可省略 進位旗標,預設值為 SG_Normal ,分
  1. 一般的四捨五入法 = SG_Normal
  2. 下高斯 = SG_Lower (無條件捨去)
  3. 上高斯 = SG_Upper (無條件進入)
Base 可省略 基底,表對 0 的偏差

任意基底階梯函數說明圖

範例

範例 傳回值 說明
CValue(2.5,4) 4 以 4 為間距,對 2.5 做四捨五入進位至 0 或 4
CValue(2.5,4,SG_Lower) 0 以上式為例,做無條件捨去法
CValue(2.5,4,,2) 2 如上圖,修正對 0 位移,使進位至 2 或 6
CValue(2.5,4,SG_Upper,2) 6 以上式為例,做無條件進位法
CValue(2.58,0.1) 2.6 以 0.1 為間距,對 2.5 做四捨五入進位至 2.5 或 2.6
CValue(2.5,,SG_Upper) 3 以 1 為間距,對 2.5 做做無條件進位法進位至 3

進制互轉:

變數轉16進位VariantToHex(SourceVariant, BigEndian)

目前僅支援短整數(Integer)、長整數(Long)、單精度變數(Single)、倍精度變數(Double)、貨幣(Currency)、日期(Date)、字串(String)、物件(Object)、錯誤(Error)、布林(Boolean)、十進位值(Decimal)、位元(Byte)、陣列(Array),其他目前無需求,暫不考慮發展!

函數與 VB 的 Hex 主要不同處在於本函數傳回記憶體中的16進位值, VB 的 Hex 會先將浮點數轉成整數後傳回,因此本函數傳回值包含有 0 及浮點數指數部分,範例及差異請參閱下表:

項目 短整數
Integer
長整數
Long
單精度變數
Single
倍精度變數
Double
函數內容 VariantToHex(1, True) VariantToHex(1&, True) VariantToHex(1!, True) VariantToHex(1#, True)
傳回值 0001 00000001 3F800000 3FF0000000000000
函數內容(VB) Hex(1) Hex(1&) Hex(1!) Hex(1#)
傳回值 1 1 1 1
函數內容 VariantToHex(-1, True) VariantToHex(-1&, True) VariantToHex(-1!, True) VariantToHex(-1#, True)
傳回值 FFFF FFFFFFFF BF800000 BFF0000000000000
函數內容(VB) Hex(-1) Hex(-1&) Hex(-1!) Hex(-1#)
傳回值 FFFF FFFFFFFF FFFFFFFF FFFFFFFF
項目 貨幣
Currency
日期
Date
字串
String
布林
Boolean
SourceVariant引數 -1@ 2000/6/15 12:00 AM 培基語言 True
BigEndian引數 True True [省略] True
VariantToHex傳回值 FFFFFFFFFFFFD8F0 40E1EA8000000000 F957FA579E8A008A FFFF
Hex傳回值 FFFFFFFF 8F54 錯誤代碼 13 FFFF
項目 錯誤
Error
十進位值
Decimal
SourceVariant引數 CVErr(1) CDec(1)
BigEndian引數 True True
VariantToHex傳回值 0001 0000000000000001000000000000
Hex傳回值 錯誤代碼 13 1

物件(Object) :

Dim tFont As New StdFont
Debug.Print VariantToHex(tFont, True) ' 傳回物件在記憶體位置之 16 進位值

陣列 (Array) :

ReDim TestArray(1 To 3)

TestArray(1) = 1 : TestArray(2) = "培基語言" : TestArray(3) = -1#

Debug.Print VariantToHex(TestArray, True)
' 傳回 0001F957FA579E8A008ABFF0000000000000

附註:

字串傳回的是 UniCode 的 16 進位值,若需傳回 ASCII 的 16 進位值 (存在檔案中的 16 進位值) ,則改為:

VariantToHex(StrConv("培基語言",vbFromUnicode)) ' 傳回 B0F6B0F2BB79A8A5

由於 Windows 採用 Little Endian ,故預設改依記憶體順序排列,欲輸出類同 Hex 先高位元後低位元者,則需設定 BigEndian 引數為 True

16進位轉變數HexToVariant(HexString, wFlags, BigEndian),為 VariantToHex 之反函數

目前僅支援位元(Byte)、短整數(Integer)、長整數(Long)、單精度變數(Single)、倍精度變數(Double)、貨幣(Currency)、日期(Date)、字串(String)、錯誤(Error)、布林(Boolean)、十進位值(Decimal)、陣列(Array),其他目前無需求,暫不考慮發展!

引數:

HexString:16進位字串

wFlags:轉換後之型別,目前支援 vbInteger、vbLong、vbSingle、vbDouble、vbCurrency、vbDate、vbString、VbError、vbBoolean、VbDecimal、vbByte、vbArray

範例:以下範例僅列引數 HexToVariant(..., ..., True)

項目 位元
Byte
短整數
Integer
長整數
Long
單精度變數
Single
倍精度變數
Double
函數內容 "1",vbByte "1",vbInteger "1",vbLong "1",vbSingle "1",vbDouble
傳回值 1 1 1 1.401298E-45 4.94065645841247E-324
項目 貨幣
Currency
日期
Date
字串
String
布林
Boolean
HexString FFFFFFFFFFFFD8F0 40E1EA8000000000 F957FA579E8A008A FFFF
wFlags vbCurrency vbDate vbString vbBoolean
BigEndian True True [省略] True
VariantToHex傳回值 -1@ 2000/6/15 12:00 AM 培基語言 True
項目 錯誤
Error
十進位值
Decimal
HexString 1 1000000000000
wFlags vbError vbDecimal
BigEndian True True
VariantToHex傳回值 錯誤 1 1

附註:

字串引數使用的是 UniCode 的 16 進位值,若需使用 ASCII 的 16 進位值 (存在檔案中的 16 進位值) ,則改為:

StrConv(HexToVariant("B0F6B0F2BB79A8A5",vbString),vbUnicode)
' 傳回 "培基語言"

陣列 (Array) :

由於難以指定字串分割處,故不支援轉為陣列字串變數

可在即時運算視窗輸入

tVal=HexToVariant("010203",vbByte+vbArray) : For i=LBound(tVal) to UBound(tVal):? tVal(i) : Next

' 傳回


由於 Windows 採用 Little Endian ,故預設改依記憶體順序排列,欲輸出類同 Hex 先高位元後低位元者,則需設定 BigEndian 引數為 True

求取質數GetPrimeNumber(UpBound) 以陣列方式傳回所有小於(包含) UpBound 的質數,但不包含 1

範例

tVal=GetPrimeNumber(100)
for i=lbound(tVal) to ubound(tVal)
 debug.Print tVal(i)
next i

Big Endian 與 Little Endian 互轉EndianBigToLittle(hEndian)

傳回值:根據引數型態傳回轉換完對應之值

引數型態:目前僅支援短整數(Integer)、長整數(Long)、單精度變數(Single)、倍精度變數(Double),其他目前無需求,暫不考慮發展!

範例:

Debug.Print EndianBigToLittle(170328064&) ' 傳回 9994

補充說明:

不同作業系統所出的二進位檔可能為 Big 或 Little 方式排列,在交換檔案時應考慮到資料轉換,本函數即為此撰寫一 Big, Lttle 互轉函數

big endian byte order

Left-to-right byte ordering of an integer word. This byte-ordering method is used on many UNIX systems including Sun, Hewlett-Packard®, IBM®, and Data General AViiON®.

little endian byte order

Right-to-left byte ordering of an integer word. This byte-ordering method is used on many operating file systems including DEC OSF/1™, DEC OpenVMS™, MS-DOS®, and Windows NT™.

高斯消去法SolveGauss

引數:為一個 n x n+1 維的陣列

其原始方程式 AX = C
其引數陣列 gMatrix() 為
其傳回陣列 gMatrix() 為

 

傳回值 說明
-1 陣列維度檢查不為 n x n+1 維
0 無解
1 唯一解
2 無限多組解
3 相依方程式,無解或無限多組解

變數轉 2 進位VariantToBinary(Expression[, NotZero][, BigEndian])

引數 說明
Expression 目前僅支援短整數(Integer)、長整數(Long)、單精度變數(Single)、倍精度變數(Double)、貨幣(Currency)、日期(Date)、字串(String)、物件(Object)、錯誤(Error)、布林(Boolean)、十進位值(Decimal)、位元(Byte)、陣列(Array),其他目前無需求,暫不考慮發展!
NotZero 前置 0 是否保留,預設為不保留 (True)
BigEndian 來源字串是否為由高位元往低位元排序

呼叫範例:

型態 Expression NotZero BigEndian 傳回值
短整數 1 省略 True 1
短整數 1 False True 0000000000000001
長整數 -1& False True 11111111111111111111111111111111
單精度 -1! False True 10111111100000000000000000000000
倍精度 -1# False True 1011111111110000000000000000000000000000000000000000000000000000
貨幣 -1@ False True 1111111111111111111111111111111111111111111111111101100011110000
日期 2000/6/15 False True 0100000011100001111010101000000000000000000000000000000000000000
字串 培基語言 False 省略 1111100101010111111110100101011110011110100010100000000010001010
布林 True False True 1111111111111111
位元 1 False True 00000001
錯誤 CVErr(1) False True 0000000000000001
十進位值 CDec(1) 省略 True 1000000000000000000000000000000000000000000000000

物件(Object) :

Dim tFont As New StdFont
Debug.Print VariantToBinary(tFont, , True)
' 傳回物件在記憶體位置之 2進位值 1001010100100111000010101100

陣列 (Array) :

ReDim TestArray(1 To 3)

TestArray(1) = CByte(1) : TestArray(2) = 1 : TestArray(3) = -1!

Debug.Print VariantToBinary(TestArray, False, True)
' 傳回 00000001000000000000000110111111100000000000000000000000

附註:

字串傳回的是 UniCode 的 2 進位值,若需傳回 ASCII 的 2 進位值,則改為:

VariantToBinary(StrConv("培基語言",vbFromUnicode))
' 傳回 1011000011110110101100001111001010111011011110011010100010100101

由於 Windows 採用 Little Endian ,故預設改依記憶體順序排列,欲輸出類同 Hex 先高位元後低位元者,則需設定 BigEndian 引數為 True

位元組轉 16 進位ByteToHex(ByVal hBytes)

引數 說明
hBytes 位元組或位元組陣列

說明:

本函數為變數轉16進位之子函數,主要為用途為將記憶體內之資料以 16 進位送出,便於除錯

呼叫範例:

Public Function VariantToHex(ByVal Expression)

tBytes = VariantToBytes(Expression)
VariantToHex = ByteToHex(tBytes)

End Function

16 進位轉位元組HexToByte(ByVal HexString As String)

引數 說明
HexString 16 進位字串

說明:

本函數為16進位轉變數之子函數,主要為用途為將 16 進位字串轉換為位元組陣列送出,便於除錯

呼叫範例:

tByte = HexToByte(HexString)

變數轉位元組VariantToByte(ByVal Expression[, BigEndian])

引數 說明
Expression 目前僅支援短整數(Integer)、長整數(Long)、單精度變數(Single)、倍精度變數(Double)、貨幣(Currency)、日期(Date)、字串(String)、物件(Object)、錯誤(Error)、布林(Boolean)、十進位值(Decimal)、位元(Byte)、陣列(Array),其他目前無需求,暫不考慮發展!
BigEndian 輸出位元陣列是否為由高位元往低位元排序

說明:

本函數為變數轉16進位變數轉 2 進位之子函數,主要為用途為將變數轉為位元組陣列後,再決定以 16 進位輸出或 2 進位輸出

呼叫範例:

Public Function VariantToHex(ByVal Expression)

tBytes = VariantToByte(Expression)
VariantToHex = ByteToHex(tBytes)

End Function

附註:

由於 Windows 採用 Little Endian ,故預設改依記憶體順序排列,欲輸出類同 Hex 先高位元後低位元者,則需設定 BigEndian 引數為 True

位元組轉 2 進位ByteToBinary(hBytes, [NotZero])

引數 說明
hBytes 位元組或位元組陣列
NotZero 前置 0 是否保留,預設為不保留 (True)

說明:

本函數為變數轉 2 進位之子函數,主要為用途為將記憶體內之資料以 2 進位送出,便於除錯

呼叫範例:

Public Function VariantToBinary(ByVal Expression, Optional ByVal NotZero As Boolean = True) As String

tBytes = VariantToBytes(Expression)
VariantToBinary = ByteToBinary(tBytes, NotZero)

End Function

2 進位轉變數BinaryToVariant(strBinary, wFlags[, BigEndian]),為 VariantToBinary 之反函數

目前僅支援位元(Byte)、短整數(Integer)、長整數(Long)、單精度變數(Single)、倍精度變數(Double)、貨幣(Currency)、日期(Date)、字串(String)、錯誤(Error)、布林(Boolean)、十進位值(Decimal)、陣列(Array),其他目前無需求,暫不考慮發展!

引數:

strBinary:2 進位字串

wFlags:轉換後之型別,目前支援 vbInteger、vbLong、vbSingle、vbDouble、vbCurrency、vbDate、vbString、VbError、vbBoolean、VbDecimal、vbByte、vbArray

範例:以下範例僅列引數 BinaryToVariant(...)

型態 strBinary 字串  wFlags BigEndian 傳回值
長整數 1 省略 True 1
短整數 1 vbInteger True 1
長整數 11111111111111111111111111111111 vbLong True -1&
單精度 10111111100000000000000000000000 vbSingle True -1!
倍精度 1011111111110000000000000000000000000000000000000000000000000000 vbDouble True -1#
貨幣 1111111111111111111111111111111111111111111111111101100011110000 vbCurrency True -1@
日期 0100000011100001111010101000000000000000000000000000000000000000 vbDate True 2000/6/15
字串 1111100101010111111110100101011110011110100010100000000010001010 vbString 省略 培基語言
布林 1111111111111111 vbBoolean True True
位元 00000001 vbByte True 1
錯誤 0000000000000001 VbError True CVErr(1)
十進位值 1000000000000000000000000000000000000000000000000 VbDecimal True CDec(1)

附註:

字串引數使用的是 UniCode 的 2 進位值

陣列 (Array) :

由於難以指定字串分割處,故不支援轉為陣列字串變數

例如即時運算視窗輸入

tVal=BinaryToVariant("0100001011111111",vbByte+vbArray) : For i=LBound(tVal) to UBound(tVal):? tVal(i) : Next

' 傳回
66
255 

附註:

由於 Windows 採用 Little Endian ,故預設改依記憶體順序排列,欲輸出類同 Hex 先高位元後低位元者,則需設定 BigEndian 引數為 True

2 進位轉位元組BinaryToByte(ByVal strBinary As String)

引數 說明
strBinary 2 進位字串

說明:

本函數為2 進位轉變數之子函數,主要為用途為將 2 進位字串轉換為位元組陣列送出,便於除錯

呼叫範例:

tByte = BinaryToByte(strBinary)

位元組轉變數ByteToVariant(hBytes, wFlags[, BigEndian]),本函數為16進位轉變數之子函數

目前僅支援位元(Byte)、短整數(Integer)、長整數(Long)、單精度變數(Single)、倍精度變數(Double)、貨幣(Currency)、日期(Date)、字串(String)、錯誤(Error)、布林(Boolean)、十進位值(Decimal)、陣列(Array),其他目前無需求,暫不考慮發展!

引數 說明
hBytes 位元組或位元組陣列
wFlags 轉換後之型別,目前支援 vbInteger、vbLong、vbSingle、vbDouble、vbCurrency、vbDate、vbString、VbError、vbBoolean、VbDecimal、vbByte、vbArray,預設為 vbLong
BigEndian 輸出位元陣列是否為由高位元往低位元排序

範例:請參考16進位轉變數

由於難以指定字串分割處,故不支援轉為陣列字串變數

自訂傳回變數型態myVarType(Expression)

引數 說明
Expression 變數

說明:

本函數與 VB 內建函數 VarType 相符,主要為修正 VarType 針對 Object 的小 Bug ,如下例, VarType 應該要傳回 9 (vbObject) ,但實際上傳回為 8 (vbString)

呼叫範例:

Dim tFont As New StdFont

Debug.Print VarType(tFont), myVarType(tFont)

' 傳回 8, 9

自訂傳回物件記憶體位置myObjPtr(hObject)

引數 說明
hObject 物件變數

說明:

本函數與 VB 內建保留函數 ObjPtr 功能相符

呼叫範例:

Dim tFont As New StdFont

Debug.Print myObjPtr(tFont), ObjPtr(tFont)

' 傳回 6498992, 6498992 (註:每次產生物件記憶體位置並不相同)

傳回特別數學值GetSpecialValue(lpRepresents, wFlags)

引數 說明
lpRepresents 列舉常數,預設為 SV_Plus_Infinity
wFlags 單精度或倍精度變數

說明:

引數 lpRepresents 之列舉常數說明如下:

lpRepresents 說明 傳回值
SV_Plus_Infinity 正無限大數 1.#INF
SV_Minus_Infinity 負無限大數 -1.#INF
SV_Plus_Not_a_Number 正非數,類似無意義之數值 1.#QNAN
SV_Minus_Not_a_Number 負非數,類似無意義之數值 -1.#QNAN

呼叫範例:

Debug.Print GetSpecialValue

' 1.#INF

附註:

本函數傳回值若用 IsNumeric 判讀均為真,但 VB 不支援,故無法進行運算,但仍可進行邏輯比較,如搜尋最小值前,可將暫存值設為無窮大等,以保證任一值均小於無窮大

本函數主要供混合語言使用,如當發生 1 除以 0 時,則應為無限大,當發生 0 除以 0 時,則為無意義,此時可設為正非數

本函數參考文件為 IEEE 754 Table D-2, p.187

以高斯消去法解反矩陣InverseOfGauss(gMatrix)

引數 說明
gMatrix 陣列變數

說明:

高斯消去法為標準反矩陣解法,若需更快速或記憶體需求更小的演算法,請自行參閱數值分析相關書籍

傳回值 說明
-2 陣列維度檢查不為方陣
-1 不為陣列
其他值 含相依向量,無反矩陣
陣列 唯一解反矩陣

呼叫範例:

ReDim tArray(1 To 3, 1 To 3)

tArray(1, 1) = -1: tArray(1, 2) = 2: tArray(1, 3) = -3
tArray(2, 1) = 1: tArray(2, 2) = 2: tArray(2, 3) = 3
tArray(3, 1) = 1: tArray(3, 2) = 1: tArray(3, 3) = 1

aArray = InverseOfGauss(tArray)

' 傳回 tArray 反矩陣 aArray

傳回轉置矩陣MatrixTranspose(gMatrix)

引數 說明
gMatrix 陣列變數

說明:

傳回值 說明
-1 不為陣列
陣列 轉置矩陣

呼叫範例:

ReDim tArray(1 To 3, 1 To 3)

tArray(1, 1) = -1: tArray(1, 2) = 2: tArray(1, 3) = -3
tArray(2, 1) = 1: tArray(2, 2) = 2: tArray(2, 3) = 3
tArray(3, 1) = 1: tArray(3, 2) = 1: tArray(3, 3) = 1

aArray = MatrixTranspose(tArray)

' 傳回 tArray 轉置矩陣 aArray

兩矩陣相乘MatrixMultiply(gaMatrix, gbMatrix)

引數 說明
gaMatrix 陣列變數
gbMatrix 陣列變數

說明:

兩矩陣相乘中,若陣列 Ai * k 維,則 陣列 B 需為 k * j

傳回值 說明
-2 未通過陣列維度檢查
-1 不為陣列
陣列 唯一解兩矩陣相乘結果

呼叫範例:

ReDim tArray(1 To 3, 1 To 3)

tArray(1, 1) = -1: tArray(1, 2) = 2: tArray(1, 3) = -3
tArray(2, 1) = 1: tArray(2, 2) = 2: tArray(2, 3) = 3
tArray(3, 1) = 1: tArray(3, 2) = 1: tArray(3, 3) = 1

aArray = InverseOfGauss(tArray)
aArray = MatrixMultiply(tArray, aArray)

' 傳回 tArray 與 tArray 反矩陣 aArray 相乘矩陣 (單位矩陣)

其他進制轉換成其他 Variant 型態

本部分屬於垃圾級的技巧,實際上支援這個技巧的函數有16進位轉變數2 進位轉變數位元組轉變數及前述相關函數之逆轉換,由於逆轉換為自動轉換,故不特別說明。但 VB 並不支援本部分討論內容轉換後的運算,僅能顯示,故為垃圾級的技巧,為求方便說明僅以16進位轉變數為例說明之,與 VB 內建之型態重複者不再說明,請參閱超連結內之說明

除 VB 內建之型態外,目前僅支援單位元整數(VT_I1)、無符號短整數(VT_UI2)、無符號長整數(VT_UI4)、整數(VT_INT)、無符號整數(VT_UINT),其他目前無需求或是 VB 連顯示都不支援者 (如超長整數(VT_I8)、無符號超長整數(VT_UI8)),暫不考慮發展!

HexToVariant 函數之引數:

HexString:16 進位字串

wFlags:轉換後之型別,目前支援 VT_I1、VT_UI2、VT_UI4、VT_INT、VT_UINT

範例:以下範例僅列引數 Debug.Print HexToVariant(...)

型態 HexString 字串  wFlags 傳回值
單位元整數 80 VT_I1 -128
無符號短整數 FFFF VT_UI2 65535
無符號長整數 FFFFFFFF VT_UI4 4294967295
整數 FFFFFFFF VT_INT -1
無符號整數 FFFFFFFF VT_UINT 4294967295

附註:

  1. 因 VB 不直接支援本部分說明之運算,為避免初學者誤用, wFlags 需自行輸入,無法利用 VB 提供之自動輸入功能完成
  2. VB 內建之位元(vbByte)為無符號單位元整數
  3. 在 32 位元作業系統中,整數之型態及特性類同長整數

轉換成其他 Variant 型態myVariantChangeType( SourceVariant, ChangeType)

本部分範例同上例屬於垃圾級的技巧, VB 內建之型態均可透過 VB 內建函數轉換,如 CSng 等之類,本函數的優點是單一函數可轉換為任意型態而已

引數 型態 說明
SourceVariant Variant 來源變數
ChangeType Long 欲轉換形態之常數

範例:以下範例僅列引數 Debug.Print myVariantChangeType(...)

型態 SourceVariant ChangeType 傳回值 備註
單位元整數 -1 VT_I1 -1  
無符號短整數 65535 VT_UI2 65535  
無符號長整數 4294967295 VT_UI4 4294967295  
整數 -1 VT_INT -1  
無符號整數 4294967295 VT_UINT 4294967295  
位元 "255" VT_UI1
vbByte
255 同VB 內建 CByte 函數
字串 255 VT_BSTR
vbString
"255" 同VB 內建 CStr 函數

附註:

  1. 除 VB 內建之變數型態外, VB 不直接支援本部分說明之運算,基於考量需用此函數轉換應為特殊應用,ChangeType 採 Variant 之所有變數型態, VB 內建常數如 vbByte 等無法利用 VB 提供之自動輸入功能完成,需自行輸入
  2. 若有 VB 內建函數對應之型態,本範例不再重複,僅介紹位元及字串兩例供比較對照