lua中大数相乘的问题

math.maxinteger * 2 --> -2

原因:math.maxinteger的二进制 :
0111111111111111111111111111111111111111111111111111111111111111
往左移位,最右加一个0,是
1111111111111111111111111111111111111111111111111111111111111110
对应的十六进制机器位 0xFFFFFFFFFFFFFFFE 对应的真值也就是-2

math.mininteger * 2 --> 0

对应二进制:
1000000000000000000000000000000000000000000000000000000000000000
乘二后的二进制:
0000000000000000000000000000000000000000000000000000000000000000
显然是0

math.maxinteger * math.maxinteger

同样采用移位的思路分析,已知maxinteger是奇数,那么就是math.maxinteger的二进制移位n次后再加一个数m,首先确定n是多少,math.maxinteger 是2^63+(-1),n是63, 之后确定m,m=-1
先把math.maxinteger 左移 63位,为:
1000000000000000000000000000000000000000000000000000000000000000
对应真值 mininteger (也就是-2^64)
再加上-math.maxinteger(二进制
1000000000000000000000000000000000000000000000000000000000000001
),
1000000000000000000000000000000000000000000000000000000000000000
+
1000000000000000000000000000000000000000000000000000000000000001

结果是:
0000000000000000000000000000000000000000000000000000000000000001

显然真值为1

math.mininteger * math.mininteger --> 0

可以从补码乘法的角度理解,具体参考补码乘法。
https://web.archive.org/web/20150213203512/http://pages.cs.wisc.edu/~cs354-1/beyond354/int.mult.html

方便起见,以4位计算机为例:(有符号整数范围-8到7)

          11111000        -8
	   x  11111000     x  -8
      ----------------    ------
	      00000000         
	     00000000
	    00000000
       11111000
      11111000
     11111000
    11111000
   11111000
  ----------------
   111000001000000

截断后四位,真值是0, 同理,math.mininteger * math.mininteger的结果也是0

值得一提的是,如果观察后8位,同样能得出64的正确真值,而这个数对16取模依然是0(等效于溢出后的运算结果)

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Lua脚本编程可以很方便地实现矩阵相乘的操作。矩阵相乘是指两个矩阵的对应元素相乘后再求和的运算。 首先,我们需要用Lua语言创建两个矩阵。可以使用嵌套的Lua表来表示矩阵,其每个内层表代表矩阵的一行。 接下来,编写一个函数来实现矩阵相乘的操作。该函数需要接收两个矩阵作为输入,并返回它们的乘积矩阵。在函数,我们可以使用两个嵌套的循环来遍历矩阵的行和列,并在每个位置上进行元素相乘的操作。最后,将相乘的结果求和并保存到新的矩阵。 最后,我们可以在主程序调用这个函数来测试矩阵相乘的功能,将结果输出到控制台上。 以下是一个示例的Lua脚本实现: ```lua -- 创建两个矩阵 matrix1 = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} } matrix2 = { {10, 11, 12}, {13, 14, 15}, {16, 17, 18} } -- 定义矩阵相乘函数 function matrixMultiplication(matrix1, matrix2) rows1 = #matrix1 cols1 = #matrix1[1] rows2 = #matrix2 cols2 = #matrix2[1] -- 检查两个矩阵是否可以相乘 assert(cols1 == rows2, "矩阵无法相乘") result = {} for i = 1, rows1 do result[i] = {} for j = 1, cols2 do sum = 0 for k = 1, cols1 do sum = sum + matrix1[i][k] * matrix2[k][j] end result[i][j] = sum end end return result end -- 调用矩阵相乘函数并输出结果 matrix3 = matrixMultiplication(matrix1, matrix2) for i = 1, #matrix3 do for j = 1, #matrix3[1] do io.write(matrix3[i][j], " ") end io.write("\n") end ``` 以上示例的输出结果将是一个3x3的矩阵,内容为: 84 90 96 201 216 231 318 342 366 以上就是使用Lua脚本进行矩阵相乘的方法及示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值