サイテック株式会社 > 【連載】新人女子プログラマーの技術修行日記 - 第7回 Flex編② 四則演算の落とし穴

エンジニア募集中!

サイテック株式会社で、根っからの技術者である社長や、大手IT企業から転職してきた仲間たちと議論しながら、社会をもっと豊かに、幸せにするアプリケーションを作ってみませんか?

  • Webアプリケーションエンジニア
  • エンジニア実習生

詳細はこちら

2009年09月17日 19:30

新人女子プログラマーの技術修行日記
第7回 Flex編② 四則演算の落とし穴 * * * *

by ゆきんこ

Tags: RIA・リッチクライアント 丸め誤差 浮動小数点数 Flex

Flexに限らないようなのですが、四則演算でNumber型の計算は正確に表現できないようです。

 

つまり『4.57-2.57』みたいな計算ですが、

普通に考えると答えは"2"のはずですが、プログラム上はなぜか”2.0000000000000004”という結果になります。

 

たむかいさんに聞いてみると、Number型では高精度の演算はできないとのこと。

 

なぜ”2.0000000000000004”になるのか?

気になって調べてみました。

 

同じく気になってる方いらっしゃいました↓

http://www.fxug.net/modules/xhnewbb/viewtopic.php?topic_id=3178&forum=16&post_id=12849#forumpost12849

 

引用:
Number データ型では、2 進数浮動小数点計算のための IEEE 規格(IEEE-754)で指定されている
64 ビット倍精度フォーマットを使用します。

これが原因のようですね。

IEEE-754と2進数浮動小数点の計算についてはこちらに詳しくありますが、

つまり2進数で計算されるために起こる”丸め誤差”が原因でした。

 

これ常識のようですね(^^;)勉強不足ですみません。。

ウィキペディアより引用:
浮動小数点数の内部表現は2進数であるため、各ビットの重みは1⁄2、1⁄4 ...となるが、
1⁄3など、2進数で表せない重みが使われると無限小数となり、途中から切り捨てられるために誤差が出る。
たとえば、0.05は2進小数にすると0.000011001100110011001100...というように循環小数になる。
こういう値は丸め誤差として現れてしまう。

 

Flexで高精度の演算が必要な場合はできるだけサーバー側で行うべきということですね。

ひとつ勉強になりました。

 

 

この記事の執筆者

新人女子プログラマ ゆきんこ 27歳 入社2年目

知識も技術もほぼゼロからスタートしてる、新人です。 『☆新人女子プログラマーの技術修行日記☆』書いてます。 【テー...

この人の会社をみる この人関連のイベントをさがす この人と一緒にはたらく

コメント

(メールアドレスは公開されません。メールで返答が欲しい場合などに入力してください)

このエントリへのトラックバックURL

トラックバック

トラックバックはありません