初始化 64 位 Mersenne Twister 时出现异常(整数溢出)
Exception (integer overflow) when initializing 64-bit Mersenne Twister
我正在使用 Mersenne Twister 的 64 位版本,具体版本:
A C-program for MT19937-64 (2004/9/29 version).
Coded by Takuji Nishimura and Makoto Matsumoto.
并且在编译到 Release 时收到整数溢出,但在 运行 调试期间没有出现异常。 我在高级编译选项中关闭了整数溢出。
在循环内的 mt(mti) = .... 行上抛出异常。
奇怪的是,现在我在调试编译中每隔 运行 次都会遇到这个异常,所以有些东西会潜入 Intel i7 浮点寄存器,这样我就需要断电然后再通电以擦除内存?
最后,为什么在Release中初始化总是抛出异常,而在Debug中却不初始化?
' The array for the state vector
Friend Shared mt(DefineConstants.NN - 1) As ULong
' mti==NN+1 means mt[NN] is not initialized
Friend Shared mti As Integer = DefineConstants.NN+1
' initializes mt[NN] with a seed
Public Shared Sub init_genrand64(ByVal seed As ULong)
mt(0) = seed
For mti = 1 To DefineConstants.NN - 1
mt(mti) = (6364136223846793005UL * (mt(mti - 1) Xor (mt(mti - 1) >> 62)) + mti)
Next mti
End Sub
有符号整数数据类型只能达到 32 位
无符号整数数据类型只能达到 32 位
对于 64 位数据,您应该使用 LONG 或 ULONG
整数溢出的原因是数据类型不够大,无法容纳您的 64 位数据!
将您的 mti 更改为 LONG 类型
如果您需要使用分数和小数点而不是整数
然后把你的mti改成DECIMAL类型
我正在使用 Mersenne Twister 的 64 位版本,具体版本:
A C-program for MT19937-64 (2004/9/29 version).
Coded by Takuji Nishimura and Makoto Matsumoto.
并且在编译到 Release 时收到整数溢出,但在 运行 调试期间没有出现异常。 我在高级编译选项中关闭了整数溢出。
在循环内的 mt(mti) = .... 行上抛出异常。
奇怪的是,现在我在调试编译中每隔 运行 次都会遇到这个异常,所以有些东西会潜入 Intel i7 浮点寄存器,这样我就需要断电然后再通电以擦除内存?
最后,为什么在Release中初始化总是抛出异常,而在Debug中却不初始化?
' The array for the state vector
Friend Shared mt(DefineConstants.NN - 1) As ULong
' mti==NN+1 means mt[NN] is not initialized
Friend Shared mti As Integer = DefineConstants.NN+1
' initializes mt[NN] with a seed
Public Shared Sub init_genrand64(ByVal seed As ULong)
mt(0) = seed
For mti = 1 To DefineConstants.NN - 1
mt(mti) = (6364136223846793005UL * (mt(mti - 1) Xor (mt(mti - 1) >> 62)) + mti)
Next mti
End Sub
有符号整数数据类型只能达到 32 位
无符号整数数据类型只能达到 32 位
对于 64 位数据,您应该使用 LONG 或 ULONG
整数溢出的原因是数据类型不够大,无法容纳您的 64 位数据!
将您的 mti 更改为 LONG 类型
如果您需要使用分数和小数点而不是整数
然后把你的mti改成DECIMAL类型