留年戦記

留年と工学と人間関係と毎日戦っている人のブログです. 今年は留年回避済み.プロマネのお勉強中.留学試みたりTOEICの得点向上を試みたり.普通に学校の勉強を頑張ったり工学(プログラミングも回路も)について学んでみたり.時々レーザーカッターのパラメータを記事にしてます.

【C言語】floatとdoubleで計算したら計算結果が異なる!誤差が…!の前置き〈進数その1〉

いろいろ書きたい記事がありすぎてどれを書こうか悩んでるあこさんです.

 

はい.いろいろタイトルみて_(┐「ε:)_コテッという方がいらっしゃるかもしれません(笑)floatとdoubleの精度が異なる話をしようと思っていたのですがその前に前提知識として進数の話書いた方がいいなぁと思ったので,今回は前置きとして進数について書いていこうと思います.

(散々floatとdoubleについて調べて,そのうえでやっぱり進数から書こうと決めた)

 

さてさて,皆様いつも1,2,3,.....,8,9,10と繰り上がる数字使ってますよね?

小学校の頃から使っている見慣れた数ですね.

この表現方法を「10進数」といいます.

「〇進数」という表記,トラウマがある方いらっしゃるのではないでしょうか(;´Д`)

実は私も中学の頃,初めて勉強したときにトラウマ的感覚に襲われました(笑)

というのも,計算しづらいっ!面倒くさいっ!

分かる人は「あ~…」ってなってますよね(;'∀')

というわけで解説始めていきましょう.

 

1,〇進数って?

〇には任意の数字が入ります.ちなみにこの数字は10進数です(笑)

大方,2,8,10,16が入ります.

この数字は1桁に対しどれだけの数字を表現するかというものを表記したものです.

10進数だと1桁目で10個の数が表現できますよね?

(ここで「え?1~9って9個しかないじゃん!」って思った方,0を見落としてますよっ!)

2進数の時,1桁に使われる数字は「0」と「1」のみで2個の数を表現します.

0→1→(繰り上がり)10→11→(繰り上がり)100→101→…と数字が増えていきます.上のは10進数で0→1→2→3→4→5…となっています.

16進数の時,9を超えたら次にA,B,C,D,E,Fとなります.

森博嗣さんの「すべてがFになる」を見た方は「ふふっ」ってなりますよね(笑)

(ネタバレになるのでこれ以上言わなーい)

 

2,なんで2進数とかあるの?読みづらいじゃないっ!

最初,こんな疑問を持ちました.

ただ,世の中電気信号とか音とか「ある」か「ない」で表すのが多いんですよね.

つまり,「0」か「1」で表記できた方が何かと便利なのです.

コンピュータの中には素子があり,一つ一つが電球でいうところの点灯しているかどうかで0か1を判定します.というわけでコンピュータが計算するときには0か1なのです.(あ,これ.floatとdoubleの回で大事になるのでメモするんですよっ!テストにしちゃいますよっ!)

そして,仮に電気の点灯数で数を表現すればいい,と言ってしまうと…10万などの数って10万の素子が必要になるわけで…orz

2進数だとN個の素子があれば2^N個の表現が可能です.指数関数的に表現できる数字が増えていきます.というわけで2進数とか必要なんですよ!(ごりおし感)

 

3,N進数から10進数への変換

さて,これが問題.

面倒くさい.の一歩手前.

これは計算ゴリゴリ系なのでまだ「楽しい」です….

手書きのが分かりやすいと思ったのでこんな感じという説明がてら写真を.

f:id:aconote:20161112184035j:plain

この計算式です.

ここで察しの言い方は「小数点…( ˘ω˘ )」って言ってそう(;'∀')

今回の数式は整数の時のみで小数点がある場合はi=-∞になります.

∞って言葉に抵抗のある方挙手

私です.私です(;´Д`)

∞っていうとすごーく…いやぁな感じになりますよね…(計算できねぇ!みたいな)

ここはあくまで定義上というか便宜上そう言っているだけで,ある桁数分だけで良いのですよ!変に「-∞から∞まで飛ばなきゃ!」って息を荒くしないでくださいねっ!!!

 

というのが進数のお話その1でした.

まだまだ続きますが続きはまた明日です!

ちゃんと解説すると思ったよりも長くてあこさんびっくり*1

 

 

*1:´∀`