しかし今まで受けた授業の中で浮動小数点数の表現や誤差について言われたの基礎の数学(般教)しかない。プログラムコードは扱ってないし。 結構重要だしプログラミングの標準課程(授業でも書籍でも)に入れてほしいと思うんだがなあ。
2011-06-08 00:41:45リテラルの時点で既に丸め誤差があることとか(2進数だと0.1が無限小数になるとか)、ほとんど同じ数値の減算での有効数字減少とか、大きな数値と小さな数値の加算で小さな数値の情報が失われるとか…
2011-06-08 01:32:49@nagoya313 浮動小数点数は怖いで… どこまで必要かはセガの黒い本に書いてあることくらいまでが目安かも そういう使い方には最適やねあの本
2011-06-08 01:38:13float系統は有効数字に相当する仮数部と指数部(あと符号)で表現されていることを知って各種問題は10進数で考えれば一応のところ耐える これが桁落ちや情報落ちの用語が覚えられない原因だな…
2011-06-08 01:40:49誤差の問題って気づきにくいんよ… 表示させても上の2~3ケタだけ合っててあと全く的外れな数字がそれっぽく連なってるってことになるからな…
2011-06-08 01:43:28まずは0.1って書いたリテラルですら誤差つきの値であるという全部誤差つき認識みたいなもんを持ち、あとは誤差の蓄積の概念を得ることだな ある誤差つきの値をループで1000回足したら誤差1000倍みたいな 一応理工学の実験でやってることになってるはずなんだがな…
2011-06-08 01:51:24@yappy_t 演習担当の教師は、「メンテナンス性を重視した方がいい、ここはdoubleのカウンターを使った方が見やすいし分かりやすいよね」と言っていた…。まあ、自分は黙って後者にしたのですが。
2011-06-08 01:52:37@Kuraot <=2.0は浮動小数点だと誤差って(2.0よりちょっとでも大きくなるとアウト)=の部分が高確率で残当するってのとprintfでdouble出力は%fが正解だがあまりにも間違いが多いので%lfもOKになったって経緯があったりします。
2011-06-08 01:55:10@Kuraot 0.1は1/10です。(1/2)*(1/5)です。0.2は1/5です。2進数で1/5とか10進数で1/7みたいなもんだという認識を持てば簡単です。
2011-06-08 01:56:46@nagoya313 %lfと%fはよく分かってません。それと誤差が実際より大きいもしくは小さいというのは規則はあるんですかね?
2011-06-08 02:27:33@Kuraot printfの可変長引数部分"..."にfloatを渡すと勝手にdoubleにされます。よってfloatもdoubleも%fでした。しかし、scanfではdoubleは%lfであまりにもみんな間違えるためC99で%lfでもいいことになったのです…。
2011-06-08 02:42:16今ではprintfで%lfを見ると分かってねーなこいつと思われ、それは誤りだと指摘するとC99だと正しいとか本当にどうでもいい話になってしまいました。 Cの本質は標準ライブラリの仕様じゃねーっつーの
2011-06-08 02:44:35駄目なのか・・・?@yappy_t 今ではprintfで%lfを見ると分かってねーなこいつと思われ、それは誤りだと指摘するとC99だと正しいとか本当にどうでもいい話になってしまいました。 Cの本質は標準ライブラリの仕様じゃねーっつーの
2011-06-08 02:50:52@mr_bato 保身のためにはprintfでは%fを使い、scanfでは%fと%lfを使うのがいいよ。scanfはミスると壊れるけどな…。Y研究室に入ってY教授に聞いてみよう!
2011-06-08 02:52:59