Lua练习题 第三章

2021-07-05

本文部分内容来自  https://blog.csdn.net/qq_44800780/article/details/101060427
实践与网上学习结合

3.1

3.2

练习3.2
math.maxinterger *2 左移一位 0x1111…变成1111…10 对应的值就是-2
math.mininteger * 2 左移 10000…00 左移 000000 对应的值为0
math.maxinteger * math.maxinteger 0x1111 * 0x1111 进位后变成0x0000001结果为1
math.mininteger * math.mininteger 0x100000… * 0x10000… 最高位进位 最后变成0x000… 结果位0

3.3

  • a % b == a - ((a // b) * b)
  • a // b得到的商向负无穷取整

  

 1 > for i =-10,10 do
 2 >> print(i,i%3);end
 3 -10     2
 4 -9      0
 5 -8      1
 6 -7      2
 7 -6      0
 8 -5      1
 9 -4      2
10 -3      0
11 -2      1
12 -1      2
13 0       0
14 1       1
15 2       2
16 3       0
17 4       1
18 5       2
19 6       0
20 7       1
21 8       2
22 9       0
23 10      1

3.4

1 > 2^3^4
2 2.4178516392293e+024
3 > 26-3……4
4 stdin:1: unexpected symbol near '26'
5 > 2^-3^4
6 4.1359030627651e-025
7 > 2^81
8 2.4178516392293e+024
9 >

练习3.5

12.7可以表示为以10为底的幂作为分母的分数,是否可以找到一个整数除以2的n次方得到结果为12.7即 x / 2^n = 12.7 以及 x / 2 ^ n = 5.5 x要求为整数
解决思路 从2的一次方开始 找到整数就返回

function find(num)
    local i = 0
    for j = 1,63 do
        if(math.tointeger(num * 2^j) ~= nil) then
            print(num * 2^j,"/",2^j,"==",num)
        end
    end
end
find(12.7)
find(5.5)

 

练习3.6

v = s* h/ 3
其中S是圆柱的底面积,h是圆柱的高,r是圆柱的底面半径。

function CalConevolume(h,angle)
    return ((math.tan(math.rad(angle)*h)^2.0*math.pi))*h / 3
end

 


练习3.7The Box–Muller transform 把一对均匀分布随机数映射到一对标准正态分布随机数。它有两种形式:
基本形式:用(0,1) (0,1)(0,1)均匀分布随机数,需要计算三角函数sin \sinsin和cos \coscos;
极坐标形式:用(−1,1) (-1,1)(−1,1)均匀分布随机数,且不需要计算三角函数。

function BoxMuller()
    local x = math.random()
    local y = math.random()
    x = (x==0) and 1 or x
    y = (y==0) and 1 or y
    return math.sqrt(-2*(math.log(x))) * math.sin(2*math.pi*y)
end

print(BoxMuller())

 

posted @ 2021-07-05 11:55  乌拉2021  阅读(201)  评论(0)    收藏  举报