『Luaプログラミング(第4版)』:第3章練習解答
7350 ワード
目次
まとめ
練習する
練習3.1
練習3.2
練習3.3
練習3.4
練習3.5
練習3.6
練習3.7
まとめ
数値タイプ:Lua言語の8種類の基本データ型で、数値を表すのはnumberです.数値タイプはまた2種類に分けられ,それぞれ整数型integerと浮動小数点数を表すfloatである.
コンパクトモード:標準Luaでは、整数は64ビットサイズで、浮動小数点数は二重精度です.リソースの限られたプラットフォームでは、マクロLUAを使用できます.32 BITSはシンLuaをコンパイルし,シンモードではフルサイズ32ビット,浮動小数点数は単精度である.
数値定数:数値定数を表す場合、小数点前後の内容はオプションです.3.1.123 56.すべて正しいです.
数値はもちろん指数形式で表すこともでき、例えば5 E+20.3 e 12などの前の小数部は前と同じで、小数点の前後の内容はすべてオプションで、指数部は整数でなければならず、小数ではなく、eとEはすべて可能である.
また、先頭に0 xまたは0 Xを加えて16進数を表すこともでき、Luaは同様にC 99の16進数浮動小数点数をサポートし、小数部とpまたはPで始まる指数部から構成され、16進数小数は可読性が悪いが、その演算は正確でフォーマット出力時の変換速度が速い.
math.type関数:小数部が存在するか、指数形式で表される数値は浮動小数点型値とみなされ、そうでない場合は整数型とみなされます.Lua標準ライブラリのmath.type関数は、数値のタイプ(文字列)、float、integerを返します.
算術演算:2つの整数演算結果は整数型であり、2つの浮動小数点型演算結果は浮動小数点型であり、1つの整数型1つの浮動小数点型の場合、まず整数値を浮動小数点型に変換して演算する.Luaでの整除(//)の結果は負に無限に取整され、取余(%)演算の定義はa%b==a-((a//b)*b)であるため、取模結果の記号と操作数bは同じであり、これはC類言語の取模演算とは大きく異なる.整除の結果は負に無限に取整され、ゼロに取整されるのではないからである.浮動小数点数は余剰取得と整除演算も可能です.
除算と指数演算の結果は必ず浮動小数点数であるため,両方のオペランドを浮動小数点数に変換して演算する.
リレーショナル演算:リレーショナル演算子は><=>===~=,リレーショナル演算の結果はbooleanタイプであり,数値を比較すると同じサブタイプの演算効率が高くなる.
ビット演算:Luaのビット演算機能はC言語と完全に一致し、異或の演算記号は異なり、Lua言語の異或演算子は~であり、ビットによって逆をとる記号と同じである.ビット演算は整数にしか使用できないため、演算前に両方のオペランドを整数に変換しようとします.変換に失敗した場合(小数部が0ではありません)、すぐにエラーが発生します.
演算精度:標準Luaの下で整型の最大値は2^63-1で、最小値は-2^63で、整型数の演算はすべて正確で予測可能である.一方,二重精度浮動小数点数を正確に表すことができる整数範囲は[−2^53,2^53]の間に制限され,この範囲を超えた後に多く出たビット数は記憶されないため,浮動小数点数の演算は精度損失の問題を考慮しなければならない.
演算優先度:Lua言語で演算子優先度が高い順に低い順に
^
- # ~ not
* / // %
+ -
..
<>
&
~
|
<= >= ~= ==
and
or
べき乗演算と接続オペレータが結合されているほか、他の演算子は左結合されています.
数学ライブラリ:Lua標準ライブラリには標準数学ライブラリmathがあり、一般的な数学関数のセットが含まれています.
math.tointeger浮動小数点タイプ回転型、成功しなければnilを返します
math.typeは数値タイプのサブタイプを返し、数値タイプでなければnilを返します
math.abs math.sqrt絶対値/開方(Luaではあまり役に立たず、開方は直接x^0.5)
math.sin math.cos math.tan正弦/余弦/正接
math.asin math.acos math.atanどうせ弦/逆余弦/どうせ切
math.ceil math.floor math.modf上向き/下向き/整数と小数部を得る
math.exp計算e^x
math.rad math.deg度数回転弧度/弧度回転数
math.fmod C言語での取余(整除はゼロへの取整)
math.log対数演算、デフォルトの底数はe
math.max math.min数の最大値/最小値
math.ultは2つのパラメータを符号なし演算とし,1つ目のパラメータが2つ目より小さい場合にtrue(整数パラメータ)を返す.
math.random math.randomseedは乱数を生成し、デフォルトでは[0,1)の浮動小数点数を生成し、2つの整数パラメータを与えて、[x,y]間の整数乱数/リセット乱数シードを返すこともできます.
標準数学ライブラリの定数
math.huge C言語math.hの中のHUGE_VAL,無限大
math.maxinteger math.mininteger整数の最大値/最小値
math.pi Pi値
練習する
練習3.1
.0e12 -> 0.0
0x12 -> 18
0xA -> 10
0xFFFFFFFF -> 4294967295
0x1P10 -> 1024.0
0.1e1 -> 1.0
0x0.1p1 -> 0.125
練習3.2
1.乗算2は左シフト1ビットに相当し、0111...1111は左シフト1ビット後に1111...1110となり、対応する原号値は-2となる
2.1000…0000左シフト1ビット後に0000…0000となり、対応する原符号値は0となる
3.0111…1111*0111…1111最低位を除いては1は変わらず、その他の位はいずれも進位が発生した後は0(上位1位あたりの個数に1を加算し、進位で得られた1も1を加算し、偶数個の1を維持する)
4.最上位にキャリーが発生した場合、すべてのビットは0
練習3.3
Luaにおける下取り余剰の特性は,正数ではCクラス言語におけるゼロ取り余剰と同様であるが,負数ではLua取り余剰も下取り後に余剰を加算して被除数に等しく,Cクラス言語における余剰は上向きに整列して余剰を加算して被除数に等しいことが分かる.
練習3.4
指数演算は右から左へ
練習3.5
中国語版の翻訳は間違いがあって、英語の原版は以下の通りです
大体12.7は10を底とするべき乗を分母とする点数として表すことができますが、12.7を2を底とするべき乗を分母とする点数として表すことができますか?5.5をもう一度試してみますか?
2^n*12.7の結果が整数であることを見つけるだけで、Luaには2つの簡単な方法があります.
1.得られた結果は1に対して余りを取って、結果は0で、Luaの浮動小数点数も余りを取ることができるので、とても便利です.
2.mathを使用する.tointeger関数は、整数を回転できないとnilを返し、この特性は整数かどうかを簡単に判断することができます.
結果は以下の通りです.
練習3.6
角度値の回転弧、式は結果を出します
練習3.7
Box‐Muller変換により均一分布を正規分布に変換できた.
Z=R*cosθ またはZ=R*sinθ (但しR=sqrt(-2*ln(u 1))、θ = 2*π*u 2,u 1,u 2は(0,1)の均一分布乱数であり,得られたZは標準正規分布乱数である.
1.均一分布の乱数、mathを生成する.random関数は[0,1)間の乱数を生成し,0の生成時に1の生成に変更するだけである.
2.Box-Muller式により正規分布に従う乱数を得る
テストを行う
END
まとめ
練習する
練習3.1
練習3.2
練習3.3
練習3.4
練習3.5
練習3.6
練習3.7
まとめ
数値タイプ:Lua言語の8種類の基本データ型で、数値を表すのはnumberです.数値タイプはまた2種類に分けられ,それぞれ整数型integerと浮動小数点数を表すfloatである.
コンパクトモード:標準Luaでは、整数は64ビットサイズで、浮動小数点数は二重精度です.リソースの限られたプラットフォームでは、マクロLUAを使用できます.32 BITSはシンLuaをコンパイルし,シンモードではフルサイズ32ビット,浮動小数点数は単精度である.
数値定数:数値定数を表す場合、小数点前後の内容はオプションです.3.1.123 56.すべて正しいです.
数値はもちろん指数形式で表すこともでき、例えば5 E+20.3 e 12などの前の小数部は前と同じで、小数点の前後の内容はすべてオプションで、指数部は整数でなければならず、小数ではなく、eとEはすべて可能である.
また、先頭に0 xまたは0 Xを加えて16進数を表すこともでき、Luaは同様にC 99の16進数浮動小数点数をサポートし、小数部とpまたはPで始まる指数部から構成され、16進数小数は可読性が悪いが、その演算は正確でフォーマット出力時の変換速度が速い.
math.type関数:小数部が存在するか、指数形式で表される数値は浮動小数点型値とみなされ、そうでない場合は整数型とみなされます.Lua標準ライブラリのmath.type関数は、数値のタイプ(文字列)、float、integerを返します.
算術演算:2つの整数演算結果は整数型であり、2つの浮動小数点型演算結果は浮動小数点型であり、1つの整数型1つの浮動小数点型の場合、まず整数値を浮動小数点型に変換して演算する.Luaでの整除(//)の結果は負に無限に取整され、取余(%)演算の定義はa%b==a-((a//b)*b)であるため、取模結果の記号と操作数bは同じであり、これはC類言語の取模演算とは大きく異なる.整除の結果は負に無限に取整され、ゼロに取整されるのではないからである.浮動小数点数は余剰取得と整除演算も可能です.
除算と指数演算の結果は必ず浮動小数点数であるため,両方のオペランドを浮動小数点数に変換して演算する.
リレーショナル演算:リレーショナル演算子は><=>===~=,リレーショナル演算の結果はbooleanタイプであり,数値を比較すると同じサブタイプの演算効率が高くなる.
ビット演算:Luaのビット演算機能はC言語と完全に一致し、異或の演算記号は異なり、Lua言語の異或演算子は~であり、ビットによって逆をとる記号と同じである.ビット演算は整数にしか使用できないため、演算前に両方のオペランドを整数に変換しようとします.変換に失敗した場合(小数部が0ではありません)、すぐにエラーが発生します.
演算精度:標準Luaの下で整型の最大値は2^63-1で、最小値は-2^63で、整型数の演算はすべて正確で予測可能である.一方,二重精度浮動小数点数を正確に表すことができる整数範囲は[−2^53,2^53]の間に制限され,この範囲を超えた後に多く出たビット数は記憶されないため,浮動小数点数の演算は精度損失の問題を考慮しなければならない.
演算優先度:Lua言語で演算子優先度が高い順に低い順に
^
- # ~ not
* / // %
+ -
..
<>
&
~
|
<= >= ~= ==
and
or
べき乗演算と接続オペレータが結合されているほか、他の演算子は左結合されています.
数学ライブラリ:Lua標準ライブラリには標準数学ライブラリmathがあり、一般的な数学関数のセットが含まれています.
math.tointeger浮動小数点タイプ回転型、成功しなければnilを返します
math.typeは数値タイプのサブタイプを返し、数値タイプでなければnilを返します
math.abs math.sqrt絶対値/開方(Luaではあまり役に立たず、開方は直接x^0.5)
math.sin math.cos math.tan正弦/余弦/正接
math.asin math.acos math.atanどうせ弦/逆余弦/どうせ切
math.ceil math.floor math.modf上向き/下向き/整数と小数部を得る
math.exp計算e^x
math.rad math.deg度数回転弧度/弧度回転数
math.fmod C言語での取余(整除はゼロへの取整)
math.log対数演算、デフォルトの底数はe
math.max math.min数の最大値/最小値
math.ultは2つのパラメータを符号なし演算とし,1つ目のパラメータが2つ目より小さい場合にtrue(整数パラメータ)を返す.
math.random math.randomseedは乱数を生成し、デフォルトでは[0,1)の浮動小数点数を生成し、2つの整数パラメータを与えて、[x,y]間の整数乱数/リセット乱数シードを返すこともできます.
標準数学ライブラリの定数
math.huge C言語math.hの中のHUGE_VAL,無限大
math.maxinteger math.mininteger整数の最大値/最小値
math.pi Pi値
練習する
練習3.1
.0e12 -> 0.0
0x12 -> 18
0xA -> 10
0xFFFFFFFF -> 4294967295
0x1P10 -> 1024.0
0.1e1 -> 1.0
0x0.1p1 -> 0.125
練習3.2
1.乗算2は左シフト1ビットに相当し、0111...1111は左シフト1ビット後に1111...1110となり、対応する原号値は-2となる
2.1000…0000左シフト1ビット後に0000…0000となり、対応する原符号値は0となる
3.0111…1111*0111…1111最低位を除いては1は変わらず、その他の位はいずれも進位が発生した後は0(上位1位あたりの個数に1を加算し、進位で得られた1も1を加算し、偶数個の1を維持する)
4.最上位にキャリーが発生した場合、すべてのビットは0
練習3.3
-10 2
-9 0
-8 1
-7 2
-6 0
-5 1
-4 2
-3 0
-2 1
-1 2
0 0
1 1
2 2
3 0
4 1
5 2
6 0
7 1
8 2
9 0
10 1
Luaにおける下取り余剰の特性は,正数ではCクラス言語におけるゼロ取り余剰と同様であるが,負数ではLua取り余剰も下取り後に余剰を加算して被除数に等しく,Cクラス言語における余剰は上向きに整列して余剰を加算して被除数に等しいことが分かる.
練習3.4
2.4178516392293e+024
4.1359030627651e-025
指数演算は右から左へ
練習3.5
中国語版の翻訳は間違いがあって、英語の原版は以下の通りです
Exercise 3.5: The number 12.7 is equal to the fraction 127/10, where the denominator is a power of ten. Can
you express it as a common fraction where the denominator is a power of two? What about the number 5.5?
大体12.7は10を底とするべき乗を分母とする点数として表すことができますが、12.7を2を底とするべき乗を分母とする点数として表すことができますか?5.5をもう一度試してみますか?
2^n*12.7の結果が整数であることを見つけるだけで、Luaには2つの簡単な方法があります.
1.得られた結果は1に対して余りを取って、結果は0で、Luaの浮動小数点数も余りを取ることができるので、とても便利です.
2.mathを使用する.tointeger関数は、整数を回転できないとnilを返し、この特性は整数かどうかを簡単に判断することができます.
function exercise3_5(num)
local base,sp,cnt=1,num,0
while math.tointeger(sp)==nil do --sp%1~=0
base=base*2
cnt=cnt+1
if cnt==63 then
io.write("Huge Number,Can Not Solve!
")
return
end
sp=num*base
end
sp=math.tointeger(sp)
io.write("Got It , 2^",cnt,"
");
io.write(sp,"/",base,"=",sp/base);
return
end
結果は以下の通りです.
Got It , 2^48
3574732204225331/281474976710656=12.7
Got It , 2^1
11/2=5.5
練習3.6
角度値の回転弧、式は結果を出します
function exercise3_6(h,p)
return 1.0/3.0*((math.tan(math.rad(p))*h)^2.0*math.pi)*h
end
練習3.7
Box‐Muller変換により均一分布を正規分布に変換できた.
Z=R*cosθ またはZ=R*sinθ (但しR=sqrt(-2*ln(u 1))、θ = 2*π*u 2,u 1,u 2は(0,1)の均一分布乱数であり,得られたZは標準正規分布乱数である.
1.均一分布の乱数、mathを生成する.random関数は[0,1)間の乱数を生成し,0の生成時に1の生成に変更するだけである.
2.Box-Muller式により正規分布に従う乱数を得る
function exercise3_7()
local rand1,rand2=math.random(),math.random()
rand1=rand1==0 and (1) or (rand1)
rand2=(rand2==0) and (1) or (rand2)
return math.sqrt(-2.0*(math.log(rand1)))*math.sin(2*math.pi*rand2);
end
テストを行う
tabexercise3_7={}
math.randomseed(os.time())
for i=1,10000000 do
local sp=exercise3_7()
sp=(sp+0.05)//0.1
if tabexercise3_7[sp]==nil then
tabexercise3_7[sp]=1
else
tabexercise3_7[sp]=tabexercise3_7[sp]+1
end
end
for i=-100,100,1 do
if tabexercise3_7[i]~=nil then
print(i,tabexercise3_7[i])
end
end
-46 4
-45 14
-44 26
-43 19
-42 67
-41 94
-40 156
-39 168
-38 295
-37 425
-36 593
-35 873
-34 1260
-33 1700
-32 2299
-31 3308
-30 4460
-29 5940
-28 7846
-27 10504
-26 13807
-25 17358
-24 22441
-23 28579
-22 35541
-21 43796
-20 54529
-19 65308
-18 78544
-17 94318
-16 110539
-15 129693
-14 148991
-13 171172
-12 194066
-11 218758
-10 242429
-9 266332
-8 289636
-7 312296
-6 332835
-5 351779
-4 367143
-3 381866
-2 391672
-1 397121
0 398882
1 396287
2 391313
3 380102
4 368257
5 351610
6 333307
7 312370
8 289953
9 265769
10 241824
11 218059
12 193944
13 171896
14 149872
15 130226
16 110792
17 94283
18 79484
19 65194
20 54156
21 43928
22 35677
23 28416
24 22303
25 17587
26 13716
27 10425
28 7858
29 6011
30 4462
31 3305
32 2368
33 1799
34 1164
35 906
36 651
37 458
38 291
39 170
40 130
41 89
42 41
43 28
44 18
45 8
46 11
END