[前回の内容] 浮動小数点数 (double 型) 「実数」に対応したデータ型 (cf. int 型は「整数」に対応) 「小数点を含む数」を扱う 構文 型を示すキーワード : double ( cf. 整数型の場合は int ) => 変数の宣言の時 例: double v; /* 浮動小数点数型の変数の宣言 */ v = 1.23: /* 小数点を含む値の代入 */ 入出力 出力 : printf ( "%f", v ); /* 浮動小数点数型の値の出力 */ => 「%f」だと小数点以下の表示の長さが足りない事がある => 「%20.15f」のように、表示の形式を指定して、より情報量の多い表示が可能 !!! 表示の桁数が少ないと、表示可能でないところの数値は、四捨五入されて表示される !!! printf ( "%3.1f", v ); !!! => 1.2 になる !!! 出力の指定が不十分だと、「実際の値と、表示される値が対応していない」可能性がある !!! => 十進法(人間が普段扱っている形)と 二進法(コンピュータが普段扱っている形)の違いも関係する !!! 1/5 => 0.2 (十進の場合は有限小数 / 二進法の場合は、無限、循環小数) !!! => 本質的に「人間がとらえる『数』」と「実際にコンピュータが保持している『数』 !!! には、微妙な差(誤差)がある !!! => 浮動小数点数の比較に 「==(等しい)」は使ってはいけない 入力 : scanf ( "%lf", &v ); /* double 型変数への浮動小数点数の入力 */ /* (実は..) 浮動小数点数型には float がある .. */ 計算 四則 : double 型同士の四則計算(和差積商 : +, -, *, / ) ができて、 結果も double 型になる cf 整数型の場合は、四則+余りの計算ができて、結果も整数型 !!! 整数型同士の割り算は、結果も整数型になる !!! 11 / 3 => 3 !!! 11.0 / 3.0 => 3.666.. 効果 # 整数が扱える # 「123」=> 「123.000」: 小数点の位置が、最後の数字の右に隠れている # <= 実は、小数点の位置が、最後の数字の左に隠れていると思う # 「123」=> 「12.3000」 # と、整数の和差に関しては、矛盾がおきない # 「123」+「456」=「579」 (普通の..)小数点が右にあって整数とする # 「123」+「456」= 12.3 + 45.6 # = 57.9 # = 「579」 # 小数点の位置が「固定」なら、整数の計算で、小数点数計算が可能 # !!! 掛け算や割り算をすると、小数点の位置を処理しないといけないので、ちょっと複雑 # !!! => できない事はない # => # 浮動小数点数:小数点の移動を自動的にやってくれる # => 小数点が、どんどん左に移動する ( その数値の絶対値は小さくなり、0 に近づく ..) # => 「収束」が扱えるようなる 浮動小数点数の導入によって「収束」が扱える => 実数の連続性 (の有限版:コンピュータ版) が扱える 「微積」や「解析学」で学ぶ内容が、そのままコンピュータで使える 数学は無限が扱えるが、コンピュータは有限にせざるをえないので、 (原理的に..)誤差を含む # 誤差を気にしない(許容する)ならば、連続が扱えると思ってよい 「収束」による「問題の『解法』」が利用できる(数学的な知識の活用) => 本日は、この部分(浮動小数点数の応用)の話をする予定 for 構文 繰り返しを表現する、別の方法 ( cf. 再帰/while ) 制御変数の操作を一箇所にまとめた「while 構文」 制御変数: 繰り返す文の中で、値が変更され、繰り返し条件の時に判定に利用される変数 => 本来は、一つとは限らないが、一つの事も多い => for 構文では、この制御変数への操作を一か所にまとめて、わかりやすくする 構文 : for ( <初期化式>; <条件式>; <再初期化式> ) { <繰返し命令> } !! 普通は、「<初期化式>; <条件式>; <再初期化式>」には、共通の変数(制御変数)が含まれる事が多い !! must ではない for 構文は、それと等価な、while 構文で書き換える事が可能(逆も真) for 構文を使う事によって、(イデオムの形で..) 書きやすく、読みやすい => 積極的に活用する # for 構文は、いろいろな良いイデオム(手本)になっているので、 # 他の人の「良い」for 構文をまねすると、プログラミングが上達する [リダイレクション] プログラムを実行する時(cf. ./p-001.exe )に、 printf による出力は、画面に表示されるが、 その後ろに "> ファイル名" を追加する (出力のリダイレクション) と、 画面に表示されていた内容が、画面には表示されなくなり、かつ、 その内容が、ファイルの中に上書して、記録される !! リダイレクションを利用すると(簡単に..)実行結果(普通、画面に表示される)を、 !! ファイルに記録する事ができる !! 結果を再利用可能 [本日の内容] 数値的解法 問題の答えを、誤差を含んだ形(ある程度の誤差を許容する形)で求める方法 <-> 解析的解法 : 誤差を含まない答えを求める方法(いわゆる、数学的な手法) # 解析的解法は、必ずしも無限を含んでいるわけではないが、 # 無限が(直接[あるいは、間接:例『実数』]的に)含まれる事が多い # => コンピュータでは扱えない # => 解析的な手法に、誤差を許容する形で、数値的な解法を作り、解く事になる 例 : 代数方程式を解く事を考える 代数方程式 : 二次方程式を解く 二次方程式ならば、解析的に解く事が可能 p-004.c では、解の公式(解析的な手法)で答えをもとめた p-005.c では、二次関数の連続性を利用して、数値的にもとめた(二分法) 1. 関数の連続性を利用している 2. 数値的なアプローチなので、誤差が生じてしまう p-006.c では、五次方程式の解を、数値的にといている => (数学) 五次以上の代数方程式には、「公式」が作れない事がわかっている => 「公式を利用して、答えを求める」という解析的な手法は適用できない (why ? : 方程式の解を求める公式は、その次数である 1, 2, 3, 4 という 自然数のもつ[方程式を解くのに都合のよい]性質を利用しているから ) <= 数値的アプローチを用いれば、解析的に求められない問題を解く事ができる。 => 「収束」を利用するので... 時間がかかる => 計算機が必要 無限にはできない => 誤差が生まれる 現実の世界への「数学」の適用 コンピュータを使って、計算量を減らし、誤差を許容する事によって、「数学が役立つ」