C言語のfloatとdouble

昨日書いたエントリは、少し混乱気味でした。

話の内容としては「バグを取り除いた」「しかしまだ比較的大きめな雑音が残っている」と言う二つの話なのですが、書き方が悪くて「バグを取った、それが雑音の元だった」と言う文章に読めてしまいます。ちょっと書き直していますので、昨日読んだ方は読み直していただければと思います。

さて、バグ取りの内容ですが、「評価プログラムの浮動小数点型がfloatだったのでdoubleに直した」というものです。

実装したCORDICは32bit固定小数点数です(精密に言えばQ2.30フォーマット)。したがって、制度調査をする場合、基準となる浮動小数点sine関数は、倍精度浮動小数点にする必要があります。単精度浮動小数点数は、隠しビットを含めても仮数部が24ビットしかないからです。

ということで当然倍精度浮動小数点型を使わなければならないのですが、それがわかっていてfloatを使っていたというのがバグです。つまり、私のC++言語に対する理解の誤りが根本原因でした。

私はC言語の知識が古いので、K&Rの「float型はコンパイル時にdoubleに昇格される」という知識が頭にこびりついています。C言語のANSI標準制定時にこのルールは改正され、floatはfloatとして扱われる事になっています。それは頭にたたき込んだ覚えがあるのですが、いつの間にやら溶けて消えたようです。

私の場合、経歴の長い部分をDSP屋として過ごしています。「このプロセッサではfloatは32bit。しかしそれはDSPだから」という誤った先入観念が邪魔をして「x86ではfloatは32bit、あくまで32bit」という事が頭に定着するのを阻害していたのだと思います。

言い訳でしか有りません。正しい知識無くしては、プログラムは正しく動作しないと言う当たり前のことです。

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください