浮動小数点数の形式
前回2進数でどのように少数を表現するかをやり,固定小数点数と浮動小数点数があることを学んだ.今回はその中でも浮動小数点数の形式について書いてく.
32bitの形式
最上位ビットが符号ビット,続く7ビットが指数部,残りの24ビットが仮数部というごく普通の形式.ちなみに,前回詳しくは触れなかったが,指数部が負の数の場合は,2の補数で表した数を指数部に記述する.つまり,指数部が「-1」の場合は7ビットが「1111111」(「1」の2の補数)となる.
IEEE754での32ビット形式
最上位ビットが符号ビットであることは同じだが,続く指数部は8ビット用意され,残りの23ビットが仮数部となっている.また,指数部や仮数部での表し方が先に挙げたものと異なっている.
仮数部
今回は順番を入れ替えて仮数部から先に記述.理由は指数部にもこの制約が効いてくるから.
これまでは0.xxとしたときのxx部分を仮数部としていた.しかし,IEEE754の規格では1.xxとしたときのxx部分を仮数部とすると定められている.このようにすることで0.xx型より1ビット多く保持することが可能になる.つまりその分表現の幅が広がるので,こちらの方式の方がいいんじゃない?ということで規格化されたっぽい.
指数部
少数を1.xxと表現した場合の指数の部分を扱う.0.xxから1.xxに変化しただけで,これまでと大きくは変わらない.大きく変わるのは,指数の値に+127したものが指数部となる点である.つまり,1.0×20の指数部は10進数で128(2進数で01111111)となる.
なぜこのようにするかというと,大小比較を簡単にするためである(32ビットのうち最上位ビットから符号,指数,仮数の順になっているのもこれが理由だと思ってる).
例えば-1と1を比較しようとした場合,2進数表記だと11111111と00000001で単純に比較する(2の補数を考えないで考える)と-1の方が大きいことになってしまう.しかし,そのためだけに指数部の最上位ビットだけ見るというのは処理時間等もかかってしまい効率的でない.そこで,127のバイアスをかける(127をたす)ことによって8ビットで表現可能な最小値である-127が2進数表記で00000000となり,大小比較がそのまま行なえるからである.
まとめ
浮動小数点数にもいろいろな表現方法がある.しかし,基本的には符号ビット,指数部,仮数部と並んで,規則にしたがって表現するということである.
2進数における負の数と少数の表現方法
2進数は基本的に"0"と"1"でのみ,表現される.
では,2進数で負の数や少数をどのように表しているのだろうか.
2進数における負の数の表現方法
補数
補数とは文字通り補う数という意味であり,元々の数からある数を得るために付け加え,補う数のことである.1の補数と2の補数が存在する.
1の補数
その桁数で最大値を得るために補う数のこと.
例:0011
1111 - 0011 = 1100
A.1100
ちなみにビットを反転させれば,解を得ることができる.
0011 →反転→ 1100
2の補数
次の桁に繰り上がるために補う数のこと.
例:0011
10000 - 0011 = 1101
1の補数と同様,簡単な求め方が存在する.1の補数を求めて(全ビットを反転させて),1を加えるだけ.
0011 →1の補数(反転)→ 1100 →1を加える→ 1101
なんで補数なんてやったの?
まぁタイトルからわかるように,負の数もしくは小数を表すのに必要なんだよね.ぶっちゃけると2の補数そのものが負の数となる. 仮に3 + (-3) = 0を計算してみると
0011 + 1101 = 10000
となる.4ビットで考えたときに,繰り上がりを無視すると答えは0となり,実際の計算とも一致するってわけ.ちなみに,このようにすると最上位ビットで符号がわかる.最上位ビットが0の場合は正の数もしくは0となり,1の場合は負の数となる.
2進数における少数の表現方法
固定小数点数と浮動小数点数の二通りが存在.おそらく小数表記でよく使われるのは浮動小数点数の方.ちなみに「浮動」少数点数であって,「不動」少数点数でないので注意.(こう書くとほとんど固定少数点数と意味が同じになってしまう...)
固定小数点数
小数点の位置がある位置に固定であると定義して,数を表現する方法.基本的に整数は一番右(最下位ビットの右)に小数点があると考えて,この方法を用いている.
0000.0000
これなら整数部4ビット,小数部4ビット使用できるし
000000.00
なら整数部6ビット,小数部2ビット使用できるって感じ.
00000000.
で整数を表すって使用するのが主な目的なのかな?
浮動小数点数
少数を指数表記して,"符号","仮数","指数"で数を表現する方法.
例えば,0.0025って数があった場合に,0.25×10-3って表現するのが指数表記.符号はわかると思うけど,仮数は0.25のこと,指数は-3のことを指す.ちなみに10は基数と言う.例は10進数で扱ったが,コンピュータの中では2進数なので,2となる.
つまり少数を
(符号)m×2e
と表記して,符号とmとeで数を表現しようってこと.
表現方法としては,ビットの一番上に符号を入れ,次に指数部を,最後に仮数を入れるって感じ.
例:0.1101×2^-4
符号|指数|仮数 → 0|11100|1101000000 → 0111001101000000
指数や仮数の桁数は規格によって形式化されている.次回くらいにそのあたりを書けたらいいな.
2進数と基底変換
2進数
当たり前だけど,コンピュータは2進数で動いている.
つまり,
2進数:0→1→10→11→100→101→110→111→1000→・・・ 10進数:0→1→2→3→4→5→6→7→8→・・・
ってな対応関係.
ちなみに,mbitで表せる数は2m通り.
8bitを1単位とするバイトという単位が一般的であり,このバイトと表す数として16進数がよく使われる.
16進数を使用すると1バイトを2桁で表せるかららしい.
2進数や16進数における2や16は基数と言う.
基数変換
2進数から10進数など,ある基数で表された数を別の基数で表現するために変換を行なうこと.
n進数→10進数
各桁でn桁をすることで変換可能.
0桁目からなので注意.
例:
2進数:1101.011の場合
1×23+1×22+0×21+1×20+0×2-1+1×2-2+1×(-3)=13.375
10進数→n進数
n進数→10進数とは逆にn桁で割っていく.
余りが0になるまで続けてその商を並べたものが変換後の数となる.
例:
10進数:13.375の場合
13.375÷23=1・・・5.375
5.375÷22=1・・・1.375
1.375÷21=0・・・1.375
1.375÷20=1・・・0.375
0.375÷2-1=0・・・0.375
0.375÷2-2=1・・・0.125
0.125÷2-3=1・・・0
2進数→8進数,2進数→16進数
2進数から8進数や16進数に変換するのは,8や16が23や24で表せるだけあって,簡単に行なえる.
8進数では3桁区切りで,16進数では4桁区切りでそれぞれの進数表記にすればいいだけ.
例:2進数で1101.01
8進数の場合:
001 | 101 . 010 ←3桁ないところは0を補う
1 | 5 . 2
16進数の場合:
1101 . 0100 ←4桁ないところは0を補う
D . 4 ←13は16進数でいうD
8進数→2進数,16進数→2進数
上記と逆で3(4)桁区切りで2進数に直す.
例1:8進数で15.2
1 | 5 . 2
001 | 011 . 010 → 1011.01
例2:16進数でD.4
D . 4
1101 . 0100
AtCoderに参加
前回投稿からかなり時間がたってしまいました・・・. 3日坊主も驚きの投稿間隔です((汗
今日はプログラミングコンテストの一種AtCoderにについて書いていこうかと.
そもそもAtCoderとは一体・・・?
AtCoderはオンラインで参加できるプログラミングコンテストのサイトのうちの一つです.これ以外にもTopCoderやCodeforcesなどがありますが日本語での案内があることと,コンテスト後すぐに解説がわかること,プログラミング初心者向けのコンテストがあることなどでAtCoderに参加することにしました.
参加するにはアカウントを作成するだけでOKなのですごいお手軽ですし,今の自分の実力を測ったりプログラミングのスキルをあげたりするのにも有用です.
AtCoder Beginner Contest 048に参加
今日は中級~上級向けのAtCoder Regular Contestと初級~中級向けのAtCoder beginner Contestの両方が開催されていました.さすがに上のコンテストにいきなり挑戦するのは無謀だと思ったので,おとなしくBeginnerの方に参加してきました.
ところが思ったよりもてこずってしまい,「こりゃ,一からスキル鍛えなおさなきゃなー」と思った次第です.
ちなみに過去問などを利用することもできるので興味があればやってみてください.特に初心者を抜けてある程度はプログラムできるかなー?って程度だったら結構オススメです.
ついでにこのブログにプログラムでつまずいたり気づいたりしたことも書いていこうかなと思っています.なんていったって備忘録だからね!!
Saliency Predictionとはなんぞや?
研究テーマが決まったわけだが・・・
ついこの前(といってももう二週間くらいたつのだが)僕の研究テーマが決まった。どうやらSaliency Predictionについてやるらしい。。。
「Saliency Predictiontって何!?!?」
まぁPrediction=予測だからなんかを予測するのはわかるんだけどSaliencyとか初めて聞いたぞ?まぁとりあえずSaliencyの意味を調べないとなー・・・
Saliency = 突極性、顕著性
「なるほどわからん」
研究室の先輩がたやサイトでぱらぱら調べてみるとどうやら人が画像中のどのへんをみる傾向があるのかなーってのを調べてそれを予測しようってことらしい。それならそうと素直に書いてくれればいいものを「顕著性の予測」とか書かれてもわからんよ・・・