- Q.
- なんだか情報というよりは簡単な数学の授業を受けているみたいだった。
- A.
- 「数値計算」の章はプログラミングよりも応用数学に近い内容になっています.
理系の学科に進学してプログラミングをする場合には知っておいた方が良い基礎的な
点に絞って教えているつもりです.
- Q.
- 線形合同法以外にももっと複雑な疑似乱数はどのようにつくられているのか少し興味を持った。
- A.
- 検索すると分かりますが,いろいろあります.私が学生だったころはそれ
ほど多くなかったのですが,乱数を使ったアルゴリズムが世の中で広く使われ
るようになり,良い性質を持った擬似乱数に対する需要の増加に伴い重要性が
増しているためです.私が個人的に良く使っているのは,数理科学研究科
の松本眞先生らによっ
て開発されたMersenne twisterです.
- Q.
- ところで、試験はどのような感じで出されますか?筆記なのかあるいはパソコンをその場で使って解くのかとか答え
ていただけると幸いです
- A.
- 昨年度の問題が情報科学共通資料(2011年度)
で公開されていますが,今年度も筆記試験が予定されています.
- Q.
- 単精度表現による計算は理解できたが、この表現方法の利点などがよくわからなかった。
- A.
-
良い所に気がつきましたね.単精度表現は
- 使用するメモリ量が小さい
- 使用するハードウェア量が小さい(ハードから作る場合).
- 計算速度が(比較的)速い.
という利点があるので,これらが重要視されるケースで使われます.ただ,
Ruby言語ではこれらの利点を重要視していないので,実数はすべて倍精度
表現で扱っています.
- Q.
-
以下には、単精度表現の二進数表示を10進数表示に直すプログラムを書いてみたのでのせておきます。
今日の講義での例と投票を実際に動かしてみると、次のように結果がでました。
decode_float32(0b00111111000000000000000000000000)
=> 0.5
decode_float32(0b00111111110000000000000000000000)
=> 1.5
def decode_float32(data)
_s = data & 0x80000000
_dd = data & 0x7f800000
d = data & 0x007fffff
s = _s>>31
dd = _dd>>23
mask = 0x00400000
l = 1
for i in 1..23
k= d & mask
k = k>>(23-i)
l += k * 2.0**(-i)
mask = mask>>1
end
a = l*((-1.0)**s)*2.0**(dd-127)
return a
end
ビットシフトの桁とかを間違えて、デバックが大変でした。
- A.
- 講義の範囲を超えていますが,自分でやってみたのは素晴らしいと
思います.なお,厳密にいうと,dataとして0を入れた時は,特別扱いした方が
よいでしょうし,
l = 1
for i in 1..23
k= d & mask
k = k>>(23-i)
l += k * 2.0**(-i)
mask = mask>>1
end
の部分は
l = (d+0x800000)*2.0**(-23)
とすることができます.
- Q.
-
乱数を任意の範囲で取ることは可能でしょうか?
例えば上の例だとXが[-1.0,1.0]でとれればあの気持ち悪い部分も一発で解決するのですが...。
よろしくお願いいたします。
- A.
-
実数を返す乱数の場合は,
2*rand()-1
のように,元の乱数を変換して計算するのが普通ですね.
- Q.
-
def f(x)
0.1*x
end
for x in 1..10
if f(x)==3.0
...
といった感じのプログラムで、xが3のときにif文以下が実行されるはずがされないのではないか
- A.
-
はい.xが3でもif文の条件は成り立ちません.実数の値に関しては,「整数値以外との == の比較はおこな
わない.整数値以外は差の絶対値が小さければ,同じと見なす」のが普通です.