浮動小数点の「特性」

俺しんじらんねぇよ、Access ってさ、いや Access に限ったことじゃないんだけど、VB とかでも、割り算すっと誤差がでるんだよ!単価とか計算すっと、1円あわなかったりすんの!!!これでコンピューターって言えんのかよ?びるげいつもたかが知れてるよなぁ!!!

...なぼに言わせりゃ、あんたのほうが痴れ者ですわ。

 


まーーーさーーーかーーーこんな戯言を言ってらっしゃる方は、ここの読者にはいませんよねぇ。
たしかに、浮動小数点演算では誤差が出ます。これはホントです。
しかし、この誤差は、演算処理をする人が理解して注意しなければならないもので、その利用者というのは Access なり Visual Basic なりのアプリケーションを利用する人またはそれらを利用してプログラミングをする人、つまり私達のことなのです。

浮動小数点については、MSのサイトでも幾度となく説明されてきてますし、(かなり技術的に専門的に説明した文書もちゃんとある、しかも日本語)ちょっと勉強意欲のある人なら見ると思うんですけどねぇ。それともMSのいうことなんて信じないのかなぁ。たとえばこことかこことか、これも参考になるかな。他にもいろいろありますのでご自分でも検索してみてください。

ずっと COBOL やってきた人にとっては、ここらへん理解しがたいってキモチもわかります、なぼだってコボラーだし。
COBOL の9タイプ(数値型といわれているやつ)は、実は数値ではなくて文字なんですよね。実行モジュール(コンパイルユニットかも)になった段階で文字型を数値型に置き換える処理が入るんですけど、実行中9タイプの変数に数字以外の文字が入ると十進数に変換できないよ的な実行エラーが発生しますよね。だから、COBOL やってる限り、Integer だの Long だのというコンピューターが直接数値と認識できるデータ型とオツキアイする機会はないんです。(少なくとも N○C 汎用機系の COBOL では無かった いまの PC COBOL は定かではないです)

浮動小数点については、誤差がでるというデメリットもありますが、固定小数点に比べて小数点以下の桁数に制限が無い(実際はありますけど、いっぱいいっぱいまで持てる)、演算速度が速いというメリットがあります。こんぴゅーたで言う演算ってのは何も単価の計算だの消費税の計算だのばっかりじゃありませんから。

そーは言っても、ビジネス(いや個人ユースでも)で使う場合、単価だの消費税だのの計算に誤差がでちゃー困ります。
「やっぱそうだろ??だって電卓は誤差なんか出ねぇもんなぁ!!!」なんて喜んで叫んではダメですよ。
ハードウェアとしての電卓はもちろん誤差が出ない演算ロジックになってますし、根本的に PC だの Windows とは別物です。
Windows についてる電卓は、「電卓」というソフトが誤差が出ないよーに計算して表示しているのです。
つまり、冒頭でもちと述べましたが、演算誤差に注意して最適なデータ型を選択するのはソフトウェアの仕事であり、誤差が出ちゃ困るのであれば浮動小数点型を使ってはダメなんです。

んじゃ、Access や Visual Basic ではどうすればよいか。割り算、小数点演算などで誤差が出ては困るものについては、浮動小数点型を使わずに通貨型を利用しましょう。
通貨型は固定小数点型です。小数点以下4位までしか扱えないというデメリットはありますが、割り算しようが掛け算しようが誤差は出ません。(オーバーフローしちゃうような場合は除く)フツーの金額計算には十分対応できるレベルかと。
AccessVBA でも Visual Basic でもそうですが、モジュール内で演算処理を行った場合、型を明示的に宣言しないと通貨型は使われませんので注意が必要です。

dim A as Currency
dim B as Currency

B = CCur(A / 25)

と、まぁここまでシツコク書く必要ない場合もあるかもしれませんけど、こう書くのが一番確実だし、あとでこのモジュールを見た人にも分かりやすいと思うんで、なぼはいつも CCur 関数のお世話になっています。いつものよーに、CCur 関数についてはヘルプで。

もしくは、自分で小数点を使わない計算ロジックを作ってしまうなんてやり方もありますね。COBOL みたいに、内部では数値を文字型で持ち、小数点の位置を別に持ちます。すべて整数で演算した結果に小数点の位置を付加し、その結果も文字列として扱います。
こういうカスタムモジュールを作っておいて利用するってテも無いわけではありませんが、計算速度は誉められたものじゃないでしょうね(^_^;)型のキャストが何度もかかるし。あんまりお勧めはできませんけど、それより誤差が出ないほうが先決さって場合も十分ありますし。
どんなふうに扱うとしても、メリットとデメリットは常に存在するものです。


浮動小数点の「特性」を理解しようともせず、自分の思い通りに動かないからといって(例えば「COBOL と違う」とか「電卓のように計算しろ」とか)バグだバグだと騒ぎ立てる行為は、海外へ旅行して「俺は日本人なんだからおまえらも日本語しゃべりやがれ!!」と怒鳴り散らすオヤジ(オバサンでもいいけど)と同レベルだと思うのですが。そんな奴ぁいねぇかいまどき...

どっちにしても、自分の無知と恥をさらしまくる行為であることに違いはありませんので、はずかしーからやめましょう。

トラックバック(0)

トラックバックURL: http://www.naboki.net/movabletype/mt-tb.cgi/22

地獄への階段

フォームでのデータチェック

「地獄」シリーズ一番人気コンテンツ。

排他制御の罠

あんまりこだわってもしょうがないと思うんだ、Accessだし。

ネットワークでの使用

今どきネットワークで使わないほうが珍しいんだけども、言いたいことはそーじゃないのよ。

テーブルデータの並び順

データベースに不慣れな人はしょうがない。しょうがないから黙って読め。

浮動小数点の「特性」

当サイトの評判を著しく落とすコンテンツ(笑)アンケート結果は「9」か「1」のどっちかです。

バージョンアップの恐怖

ライフサイクル って知ってる?

Accessでの五十音順

昔はよくあった問題だけど、今はこういうケース少ないよな多分。

2001年問題?!

もういい加減要らないかなぁと思いつつ...

MSDN クラウド 技術解説コミック新登場 クラウド ガール - 窓と雲と碧い空 -