前回(2019/10/18)の内容 浮動小数点数 (double 型) の応用 浮動小数点数は、「有限小数値」を表現する (疑似的に..) 実数値が利用できるようになる。 # 無限小数が扱えないので、誤差が生じてしまう (疑似的的に..) 実数の連続性が利用できる 「収束」による値の計算 プログラムの考え方(設計、アルゴリズム..)として、 「現在の値をすこしずつ、改良して、求める答えに近づくようにする」 という「手法」が使える 例 : Deep Learning の学習も、実は、「多くの場合に正解の答え出すような教育状態に近づける」アプローチ # 原理的(数学的)には、無限の学習データと無限の学習時間が存在れば、いつかは、「正確」な学習は可能だが... 数値計算 (代数方程式の解法) : 答えを「近似でよい」と割り切ることにより(現実的な時間内[有限]で、多くの分野で答えがだせるようにする手法 <=> いわゆる数学的(解析的)手法は、誤差がないかわりに、問題が解けなくなる(解く方法がなくなってしまう) n 次元の代数方程式は、複素数の範囲で(重複を含め) n 個の解がある => ガウスの証明 5 次以上の代数方程式は、一般には四則と冪根を利用して、答えを求める「公式」が作れない => ガロア/アーベルの証明 => 数値的なアプローチだと、正確さを犠牲にして、いつでも「近似解」が求めらられる => 二分法 for 構文 構文 for ( 初期化; 条件; 再初期化 ) { 繰り返し命令 } 初期化; 条件; 再初期化 で、制御変数の初期化、制御変数の条件、制御変数の更新を 行うことよって、繰り返しの制御変数にかかわる記述が一か所にまとめられるので、 => わかりやすい リダイレクション 実行するコマンドに "> ファイル名" という記述を追加する 画面への出力を、ファイルに切り換える(「出力の」リダイレクション)する機能 プログラムが画面に出力する内容を、ファイルに記録させる事できる 実行するコマンドに "< ファイル名" という記述を追加する キーボードかの入力を、ファイルに切り替える機能(入力のリダイレクション) すでにファイルに記録済のデータを、プログラム与える事ができる !!! 情報が、ファイルに記録されているので、「繰り返し利用」できる !!! 出力がファイルに保存されていれば、同じ結果を作るのに、プログラムを実行しなくてもよい !!! 入力がファイルに保存されていれば、同じ入力を何度も、キーボードから入れる必要がなくなる !!! => プログラムのテストの時には有効 !!! => 一つのプログラムの出力を、他のプログラムの入力にできる [本日の内容] 数値計算の続き 代数方程式は、関数の連続性をつかった 数値積分をやりたい。 数学の解析で定義されている(無限を含んだ)解法は、 計算機で、無限を有限であきらめて、誤差を含む形にすれば、 解析的に解けない問題でも、近似解が得れる switch 構文 (2019/09/27) プログラムは、命令をを組み合わせて作る 命令の組み合わせる手段は、三つで十分 三つ : 順接, 条件分岐, 繰り返し 前期では、条件分岐 => if 構文, 繰り返し => 再帰呼び出し 後期では、繰り返し => while 構文, for 構文 [復習] if 構文 文法 : if ( <条件> ) { <条件が成立した時の命令> } else { <条件が不成立の時命令> } 意味 : <条件>をチェックし、成立するなら <条件が成立した時の命令> を実行し、 そうでなければ、<条件が不成立の時命令> の命令を実行する !! 二つの命令のうち、どちらか一方だけを実行する if 構文の組み合わせ(イデオムがいくつか..) if 構文の入れ子 => 二個以上の命令の選択が可能 if (P) { if (Q) { C } else { D } } else { if(R) { E } else { F } } P と Q が成立すると C P が成立し、Q が成立しないと D P が成立せず、R が成立すると E P も R も成立しないと F else if if ( P ) { C } else { if ( Q ) { D } else { if ( R ) { E } else { Z } } } => 通常は、P,Q,R が同じものに対する異なる条件のチェックの場合 if ( P ) { C } else if ( Q ) { D } else if ( R ) { E } else { Z } 例 : 変数 v の値が、正負ゼロで、場合分けしたい場合 if ( v > 0.0 ) { 正の場合 } else ( v < 0.0 ) { 負の場合 } else { 正負いずれでもない (0 の時) } switch 構文 : 一つの整数式に対して、複数の値のいずれかが成立する場合の、 複数分岐の記述方法 文法: switch ( <評価式> ) { case <定数1>: <評価式>の値が <定数1> に一致する時の命令 break; case <定数2>: <評価式>の値が <定数2> に一致する時の命令 break; ... case <定数k>: <評価式>の値が <定数k> に一致する時の命令 break; default: <上記のいずれもない時>の命令 break; } 意味(実際はいろいろ違うがほぼ) if ( <評価式> == <定数1> ) { <評価式>の値が <定数1> に一致する時の命令 } else ( <評価式> == <定数2> ) { <評価式>の値が <定数2> に一致する時の命令 } ... } else { <上記のいずれもない時>の命令 } if 構文より、switch 構文の方がよい場合ある # 一つの式の値を、複数のどれかの値と一致するかどうかの判断で、命令を切り替えたい場合は、 # => 読みやすい # => 効率が良い break -- ここで、構文を終了する 命令を組み合わせる => 構文がいくつかあって いままで学んだ構文で、たぶん プログラムの 99% は済む # 自分がプログラムを書くなら、前期の内容で万能 # => ただ、他の人は違うかもしれないので、読むために学習 # 実は、他にも # do while / goto / break/continue の使い方.. # longjump .. 非常に特殊だが役に立つ.. メジャーなのは、終わったので、次回以降、データ構造の話に