2013年5月8日水曜日

【iOS,Android】信じがたい! うっそ! ゼロ除算の考察の行方!

結論から言います!

ARMアーキテクチャでは、ゼロ割(0除算)のエラーはおきません!


事の発端は!

@hamakendevelopさんのこの発言!

コレを偶然みて、そんなバカなぁ!
なんて思ってサンプルを作ったのが発端です!




まず、サンプルをMac OS Xで作ってみました!

結果は予想通り、
c = a / b;
のところで、Exception発生!




やっぱそうだよなぁ・・・
なんて思いつつ、一応、iOSのサンプルも作ってみました!

コレをiOSシミュレータで起動!
結果は予想通り、
NSLog(@"%d", a/b);
のところで、Exception発生!


そりゃそうだ!
と思って、同じソースコードをiPhone5にて動作させてみました。

ほんまや!
(明石家さんまさん風)

結果は予想に反して、iPhone5で例外が発生しませんでした!

うげ!
まじか!!!
なんて思っていたところ、

@sakiraさんが参戦!!!





ちょっと調べたところで、





と言った返信をした訳です。
あ!ちなみに、
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0205hj/CJADECCJ.html

ここを添付しました。

この時点で、もう既に、かなりの時間になっていたので、一旦休憩(笑)

その次の日。

@sakiraさんから信じがたいツイートを頂いた訳です!










まじか!

AndroidでもJavaではなくて、Native C言語をコンパイルした
実行ファイルでは、エラーが発生せず、さらに、
iOSではsignal()でのハンドリングも効かないとのこと・・・

そんな・・・そんな・・・バカな・・・なんて調べ、
いろいろと議論したところ、以下のサイトに行き着きました!

http://blog.kmckk.com/archives/4047024.html

うっそ!!!
libgccでの事だったんだ!!!

Xcodeも元々はgccが発祥なので、可能性は多いにあるとの結論に
なりました!


サイトを参照するに、

・ARMには除算命令がない

ために、libgccで除算をするしかなく、libgcc内で除算を行っている。

とのことでした!!!

とりとめのない書き方になりましたが、結論通り、

ARMアーキテクチャは除算命令がないために、libgccで除算を
行っており、libgcc内で、raise()を行っていないため、
Exceptionが発生せず、そこでCPUがストップするため、
除算結果の変数を参照すると、不定になる!

と言った事がわかりました!
(推測も入ってますが^^;;;)

最後に、@sakiraさんの言葉がカッコいい!!!