投稿

7月14日(水)1コマ目

今日、やったこと 誤差、文字コードのテスト 今日のテスト 問1 No.1 値がほぼ等しい浮動小数点同士の減算を行うと、仮数部の大半が消えてしまい、有効桁数がすくなくなります。これを けた落ち と呼びます。 No.2 扱うことができる桁数には上限があるため、仮数部の最小けた以下の値は四捨五入や切り捨て、切り上げを行って(この処理を丸めと呼ぶ)桁数内に納めます。これを 丸め誤差 と呼びます。 No.3 絶対値の大きな数と小さな数同士の加減算を行う際、指数部を合わせることでどちらかの値の仮数部が扱うことができる桁数内に収めることができなくなり、計算にも反映されなくなります。これを 情報落ち と呼びます。 No.4 扱うことができる上限を超える= オーバーフロー です。 問2 情報落ちが発生するのは絶対値の大きな数と小さな数の加減算を行ったとき。 ア 絶対値が同じような数の減算で、ケタ落ちが発生するおそれあり。 イ 絶対値が同じような数の減算で、ケタ落ちが発生するおそれあり。 ウ 2つの値は他に比べてかなり離れている。 情報落ちが発生するおそれあり 。 エ 絶対値が同じような数の減算で、ケタ落ちが発生するおそれあり。 問3 No.1 正しい。 No.2 EUC-JPはおもにUNIXやLinuxで利用される符号化方式であり、対象文字集合には漢字を 含む 。 No.3 UNICODEは多国語を収容した 文字集合 である。 No.4 符号化文字集合であるJIS X 0208には半角英数字、記号、半角カナ、制御文字を含み、全角かな も含む 。 問4 1文字が1~4バイトになるため、1バイト目か否かがわかるようにする必要がある。 UTF-8では1バイト目は0または11で始まり、2バイト目以降は10で始まることで、1バイト目か否かがわかる。 問題を1バイトずつ先頭4ビットだけ書くと以下のとおり。  33 0011 0で始まるため1文字目の1バイト目  CF 1100   11で始まるため2文字目の1バイト目  80 1000   10で始まるため2文字目の2バイト目  E3 1110   11で始まるため3文字目の1バイト目  81 1000   10で始まるため3文字目の2バイト目  AF 1010...

7月7日(水)1コマ目

イメージ
今日、やったこと 文字コードのつづき 今日のホワイトボード 先週は 文字のあつまり = 文字集合 文字を数値に置き換えるためのルール = 文字符号化方式 がポイントでした。 さらに、初期のころに使われていた文字集合と符号化方式が一体化したASCIIやJIS X 0201で実際に符号化してみました。 符号化方式 日本語を含む文字集合(JIS X 0201、JIS X 0208など)に対応した符号化方式として Shift_JIS(亜種が結構ある) EUC-JP ISO-2022-JP UTF-8 などがあります。 Shift_JIS 符号化のルールは結構めんどくさいことをやっているので省略。 SJISとも呼ばれ、日本で最も使われている符号化方式(と思う)。 図 Shift_JIS EUC-JP UNIXはこちらを利用。 文字集合ごとに符号化方式が異なる。 図 1をEUC-JPで符号化 図 半角カナのイ、ヌを符号化 図 全角カナのイ、ヌを符号化 ISO-2022-JP Web(とくにメール)で利用。 UTF-8 UNICODEとよく混合されて扱われる。 UNICODEは文字集合(文字のあつまり)。 UTF-8はUNICODE中の文字を符号化するための符号化方式。 「文字コードはUNICODEで・・」は間違った使い方。 「文字コードはUTF-8で・・」が正しい。 なぜ文字化けする? 送信側で利用した文字符号化方式と受信側で利用した文字符号化方式が一致しないため発生。 なお、ASCIIに含まれる数字、アルファベット、記号はどの符号化方式でもASCIIでの符号化方式を継承している。よって、数字、アルファベット、記号は文字化けすることは基本的にない。 結局、全角文字が文字化けすることになる。 次回は 誤差と文字コードのテストします 。 基本情報技術者試験の午前問題から誤差と文字コードに関する問題をチェックしてください。 なお、符号化方式を暗記してこいなんてことは要求しません。

6月30日(水)1コマ目

イメージ
今日、やったこと 文字コード 今日のホワイトボード 文字集合と符号化方式 文字集合は文字の集まり。 符号化方式は文字を符号化(数値)に変換するルール。 扱う文字を決めて(文字集合ができる)、各文字を数値に変換するルール(符号化方式)を決めることでコンピュータで文字が扱うことができる。 規格 文字だけでなく、いろいろなところに出てくるISOとかJIS。 図 JIS、ISO エンコードとデコード 図 エンコードとデコード ASCIIで符号化 ASCIIの対応表で変換できる。 問1 '1'を符号化 図 '1'をASCIIで2進数の符号へ 問2 a*(1+b)を符号化 図 a*(1+b)をASCIIで2進数の符号へ ASCIIでの文字の並び方 数値、アルファベットは一般的な順序と同じ順になっているため、以下のプログラムでAからZまで順に出力できる。 図 ASCIIではA~Zは順に並んでいる あくまでもAからZまで順に並んでいるからできることで、もし、飛び飛びになっていたらできない。 JIS X 0201で符号化 対応表を見ると、数字、アルファベット、記号はASCIIと同じ位置。よって、符号化しても同じ。 JIS X 0201には半角アルファベットが追加されている。これは8ビット目のエリアにある。 図 JIS X 0201で半角カタカナを符号化 UNICODE 結局、国や地域ごとに使っている文字が異なるため、それぞれの国や地域ごとに文字集合が作られた。そして、各文字集合ごとに符号化方式が定められたため、文字が異なる国や地域同士で文字データのやり取りが困難(文字化けが発生する)になった。 グローバルで1つの文字集合を作ろう!で生まれたのがUNICODE。 世界中の文字を収容している(多分)。 次回は 符号化方式の話です。 テストは再来週に誤差と文字コードの内容で行います。 対策として基本情報技術者試験の誤差と文字コードに関する問題をチェックしてください。 また、このテストが情報数学の最後のテストになります。  

6月23日(水)1コマ目

イメージ
今日、やったこと 誤差 今日のホワイトボード オーバーフロー C言語のchar型は1バイト、int型は4バイトのようにサイズが決まっている。 この サイズを超えるデータを代入すると、はみ出してしまいオーバーフローが発生する 。 図 オーバーフロー アンダーフロー C言語のfloat型やdouble型は浮動小数点形式でデータを扱っている。 割り算をすると、仮数部がどんどん小さくなっていき、最終的に0になる。 が、ゼロになる直前までは正しい値。さらに割り算をすると仮数部がゼロになる。これがアンダーフロー。 float型やdouble型のような浮動小数点形式でデータを扱うさい、扱うことができる最小値よりも小さい値になったときにアンダーフローが発生する 。さきほどのゼロはアンダーフローが発生した結果であって、正しい値ではない。 図 アンダーフロー 丸め誤差 C言語のfloat型やdouble型は浮動小数点形式でデータを扱っている。 float型の場合、仮数部は23ビット。よって、仮数部の小数点以下が23ケタを超える場合、23ケタに収めるために24ケタ目以下を切り捨てる必要がある。このとき、 24ケタ目を切り上げる 24ケタ目を切り下げる の2つの選択肢がある。この処理が 丸め処理 。 丸め処理を行うことで発生する誤差が丸め誤差 。 ちなみに、四捨五入も丸め処理の1つであり、四捨五入することで真値との誤差が発生する。この誤差も丸め誤差。 図 丸め誤差 ケタ落ち 有効桁数が少なくなることで、真値から誤差が発生する。この誤差がケタ落ち誤差。 ケタ落ちは近い値同士の引き算の際に発生する 。 情報落ち 計算をする際、2つの値の指数を合わせる。大きな値と小さな値の計算の場合、仮数の一部が切り取られてしまう。この誤差が情報落ち誤差。 大きさが極端に異なる値同士の計算をする際に発生する 。 予告 そのうちテストします。 基本情報にこの辺の問題がちょこちょこ出題されています。 確認しておいてください。

6月16日(水)1コマ目

イメージ
今日、やったこと 基数変換まとめのテスト 誤差 今日のホワイトボード コンピュータでの誤差 コンピュータには誤差なんて発生しないように思われがちですが、データ取り扱いの特徴から 誤差が発生するケースがあります 。 C言語のchar型、unsigned char型 char型、unsigned char型はともに1バイト。 〇char型 符号あり。負数は絶対値の2の補数として格納。 2進数 10進数 1111 1111 -128 0000 0000 0 0111 1111 127 〇unsigned char型 符号なし。 2進数 10進数 0000 0000 0 0111 1111 127 1000 0000 128 1111 1111 255 unsigned char型の変数に初期値1を代入し、その後+1(インクリメント)を繰り返す。 図 変数valのインクリメントを繰り返すと 変数valのインクリメントを繰り返し、その値が255(2進数では1111 1111)になったあと、さらにインクリメントするとどうなるでしょうか? ここで時間切れ。つづきは次回。  

6月9日(水)1コマ目

イメージ
今日、やったこと ビットシフトで掛け算 次回のテストのための問題演習 今日のホワイトボード ビットシフトで掛け算 問 5×6をビットシフトで計算せよ ポイントは 5または6を2のべき乗の和 にすること。 図 5×6をビットシフトで計算 問 7×-7をビットシフトで計算せよ 基本的に5×6と同じですが、-7を2進数にするときに注意。 -7は負の値なので、絶対値7の2の補数になる。 図 7×-7をビットシフトで計算 一応、計算結果の2進数を10進数にしてみた。 先頭ビットが1なので、負数。よって、1100 1111は絶対値の2の補数。 図 ビット列1100 1111を10進数へ まとめテストにむけて 結構前にやったことなので、忘れているかも。 [整数・小数]N進数->10進数 図 [整数・小数]N進数->10進数 [整数]10進数->N進数 [整数]10進数->N進数 [整数]10進数->N進数 [小数]10進数->N進数 [小数]10進数->N進数 次回は 基数変換のまとめテストします。  

6月2日(水)1コマ目

イメージ
今日、やったこと 浮動小数点のテスト ビットシフト 今日のホワイトボード ビットシフトとは ビット列を左右に動かすこと。 左方向 に動かすのは 左シフト 。 左側にできた 空白ビットには0を入れる 。 右方向 に動かすのは 右シフト 。右側にできた 空白ビットに何を入れるかは論理シフトと算術シフトで異なる 。 左シフト これは簡単。左に動かすことでできた空白ビットには0を入れる。 右シフト 右に動かすことでできた空白ビットに0を入れるのは論理シフト。これは簡単。 空白ビットに符号ビット(最上位ビット)と同じ値を入れるのは算術シフト。これは注意。 図 右シフト(算術シフト) 演習問題 右シフトは算術シフト?論理シフト? 右シフトを論理シフトにするか、算術シフトにするかは 符号 なし ビット列 => 論理シフト (0を入れる) 符号 あり ビット列 => 算術シフト (符号ビットと同じ値を入れる) で分かれる。 図 右シフトは論理シフト?算術シフト? 図 問1 図 問2 問3 16進数のケタの数字は0~Fまで。 1ケタ分は2進数では4ビットで表すことができる。 よって、1ケタずつ4ビットに2進数にすればOK。 図 問3 左シフトは何に使う 結論: 掛け算 10進数で考えると、なんてことはない。 図 左シフトは掛け算 右シフトは何に使う 結論: 割り算 10進数で考えてみる。小学校時代の答えとあまりで考えると納得。 図 右シフトは割り算 コンピュータはどうやって計算している? 計算内容 コンピュータでは 足し算 加算器 引き算 負の値を絶対値の2の補数にして加算器 掛け算 左シフト 割り算 右シフト 次回は テストはしません。