Learn iPhone, iOS, Objective-c, Swift, cocos2dx, Unity and ….?

iOSやAndroid開発でのエラー解決法や便利tipsのメモ

RSS Feed

Objective-Cで計算機をつくる

0 Comments
Posted by Kuro on 2013/02/05

スポンサードリンク

Appleのサンプルコード”UnitTest“をもとに作っていきます。
計算機用のサンプルではなくUnitTest用なので計算機部分の制御は甘めです。

    大きなところでは以下の3点

  • 数の初めにゼロを連続して入力できてしまう
  • 初めにカンマを押すとゼロが消えてカンマだけが表示される
  • 浮動小数点の誤差がそのまま出る

今回は浮動小数点の誤差について取り上げることにします。

2.10 + 2.12 = 4.220000000000001;
double型で計算するとこんな答えが返ってきます。
人間の頭で考えれば4.22なのですが、コンピュータで計算するとうまくいきません。
コンピュータの計算が正しくない原因には10進数の少数のほとんどが2進数では表せないということや有効桁数が限られているということがあります。

理由が何であれとにかく答えが合わないと困ります!
完璧な計算機は無理だとしても対応策はいろいろあります。

そのなかで、2進浮動小数点数ではなく10進浮動小数点数で保持するようにするというものがあります。
自力で実装すると大変なのですが、Objective-CにはNSDecimalNumberという数値をDecimal型(10進数)で扱うためのクラスがあるのでそれを使うことにします。

浮動小数点数による誤差の処理(NSDecimalNumber)

答えは4.22
良い感じ。

もちろんNSDecimalNumberも完璧ではありません。
以下のコードは分かりにくいでが、1÷3×3を行なっています。

答えは0.99999999999999999999999999999999999999

表示桁数と端数処理の指定(NSDecimalNumberHandler)

表示桁数と端数処理の指定にはNSDecimalNumberHandlerを使います。
decimalNumberHandlerWithRoundingModeで端数の処理方法、scaleで小数点以下の表示桁数を指定します。

0.9999…が四捨五入されて
答えは1

0.444444444を四捨五入&小数点以下2桁まで表示なので
出力結果は0.44

数値の比較

数値の比較はNSNumberで行います。

スポンサードリンク


You can leave a comment, or trackback from your own site.

0 Comments

You can be the first to comment!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

スポンサードリンク

Popular Posts