FC2ブログ
ヽ|∵|ゝ(Fantom) の 開発blog? ホーム »プログラミング
カテゴリー「プログラミング」の記事一覧

Java, C#, PHP, Ruby, Python, JavaScript での Math.round(四捨五入・五捨六入)比較  


 先日、言語間で算術関数を含む移植などしてたら、結果が違ってたので改めて調べてみた。「負の値の割り算や剰余」なんかもそうだけど、言語仕様によって値が違ってたりするので、毎回確認するのは面倒なんだよね。せっかくなので、一覧にしていつでも見れるようにしておこうと考えた。


(元の値)
JavaJavaScriptC#Python3RubyPHP
Math.roundMath.roundMath.Roundroundroundround
-2.0-2-2-2-2-2-2
-1.6-2-2-2-2-2-2
-1.5-1-1-2-2-2-2
-1.4-1-1-1-1-1-1
-1.0-1-1-1-1-1-1
-0.6-1-1-1-1-1-1
-0.5 0 0 0 0-1-1
-0.4 0 0 0 0 0 0
0.0 0 0 0 0 0 0
0.4 0 0 0 0 0 0
0.5 1 1 0 0 1 1
0.6 1 1 1 1 1 1
1.0 1 1 1 1 1 1
1.4 1 1 1 1 1 1
1.5 2 2 2 2 2 2
1.6 2 2 2 2 2 2
2.0 2 2 2 2 2 2


 実際の結果は以下の通り。paiza.io で比較した。

Java, C#, PHP でのRound結果
Java, C#, PHP
Ruby, Python, JavaScript でのRound結果
Ruby, Python, JavaScript
(クリックで拡大)

 言語によっては丸め方法のオプションなんかもあるが、そのまま使ってると四捨五入っぽかったり、五捨六入っぽかったり、0からの距離っぽかったり、値の境界が異なるので、複数の言語を使うときには気をつけた方が良いだろう。

 どうしても揃えたければ

 floor(v + 0.5)

のようにする手もある。

 また、「0からの距離でグループ分け」と「等間隔にグループ分け」で使い分けをすることもできるので、知っておいても損はないだろう。

「0からの距離でグループ分け」と「等間隔にグループ分け」
(クリックで拡大)


 まぁ、何にしても、「負の値の演算」「丸め誤差を持つ演算」「0をまたぐ演算」あたりは仕様を確認しておいた方が良いだろう。


(関連記事)
【C#】倍数での Floor, Ceil, Round(一定間隔での切り捨て、切り上げ、四捨五入) [double 版]
【Unity】倍数での Floor, Ceil, Round(一定間隔での切り捨て、切り上げ、四捨五入) [float 版]
【Java】Math.floor(), ceil(), round() 動作互換アルゴリズムを試す



スポンサーサイト

category: プログラミング

thread: プログラミング

janre: コンピュータ

tag: Java  C#  PHP  Ruby  Python  JavaScript 
tb: 0   cm: --

Android と Applet の互換ってできるもんだね  


 以前から考えていた Android と Applet の互換コーディングに成功。ほぼ想定通りだったかな。主に両プラットフォームに共通部分はインターフェイス(interface)と抽象クラス(abstract)で構成し、各プラットフォーム依存のオブジェクトは、それら共通オブジェクトをインプリメントした実装クラスをオブジェクトラッパーのように使うことにより、ほぼ同じコードで動かせるようになった。これならコピペで移植出来るね(笑)。


(左)Appletビューワ / (右)Androidエミュレータ

 見た目も細かく調整したので、ほとんど変わらない。内蔵フォントの違いなどはあるけどね。これらの実行部分はまったく同じコード。別コードで表記しなくてはならない箇所は、起動クラスとその構成を司る部分(Android では Activity と View、アプレットでは Applet)だけだね。一度それらを起動してしまえば、あとはすべてラッパークラスで十分だった。

 元々この Android と Applet の互換ライブラリは、頭にあった構想をただ作ってみただけだけど(特に意味はない。興味本位(笑))、完成してみたら、結構使えるかもね。というのは、Android のエミュレータって物凄く重いので、特にリアルタイム処理の確認には向かない。だから必ず実機で確認するしかないんだけど、このライブラリを使うとアプレットで動作を確認してから、Android 用にコンパイルしても動く。AppletViewer の動作は速いので、エミュレータ代わりに使える。これらサンプルはそうやって作ったもの。非常に開発が楽だ(笑)。

 実際に動いているものを見てみたい場合はこちら↓

[Rule Generator Demo]
Applet 版のサンプル(PC[IE]でアクセス)
Android 版のサンプル(Android2.2以降でアクセス)

 ちなみに Rule Generator というのは、トランジションルール画像の自動生成ツールを Java に移植したもの。このデモはそれをランダムに生成して、トランジション効果を試しているだけ(ゲームではない)。

 ただし、実行にはかなりメモリを食うので、スホマは Out of Memory で落ちることもあるかも。その辺の調整はまた考えるしかないね。

 ライブラリのコードは元の約3倍になってしまったが、体感的にはそれほど実行速度は落ちてないかな。リアルタイムな fps モニタ機能をつけてあるが、スマホの方が速いみたい。これからはこれで簡単なゲームでも作ってみるかな。


※キャラクター画像は「著作権フリー立ちキャラクター素材集」を使用しています。

著作権フリーキャラクター素材集


(関連記事)
【Android】【Applet】【Java】interface と abstract の使い方・違いとは~簡単なフレームワークを作って、考えてみる
【Android】【Applet】【Java】interface を使って独自のラッパークラスを作る
【Android】【Applet】【Java】interface を使ってインスタンスを生成する

category: プログラミング

thread: プログラミング

janre: コンピュータ

tag: サンプル 
tb: 0   cm: --

トランジションルール画像の自動生成を移植  



Android版トランジションルール画像自動生成

 意外とアッサリ移植できてしまった(笑)。ライブラリとして作ったので、他のゲームにも使えそう。

 ただ、ペイントソフト(PhotoShopとか)などから比べると、モアレ(縞模様)が結構出るので、多少汚いね。でも画面効果として使う分には問題なさそう。それに、画像圧縮の仕様として、同じ色や近似色が並ぶような絵柄はファイルサイズ小さくなるので良いのだけれど、ノイズっぽいのとか、パターン性があまりない画像は圧縮が効かないので、動的に生成して、ファイルを使用しなくて良いのは、随分とファイルサイズを削減できる。


トランジションルール画像同士を合成

 また、ついでにトランジションルール画像同士を合成する機能も付けておいた。例えば、横線のルール画像と右から左へのグラデーション画像をミックスして、線の入ったグラデーションを生成する。すると移動シーンのエフェクトみたいなものが簡単に作れるわけだ。


使用例

 試しに使ってみたけど、少々グラデーションの粗さはあるが、演出としては全く問題ない。これなら組み合わせ次第で色々作れるし、バリエーションにも困らない。それでもってファイルサイズ0。うん、良い仕事をしてくれる(笑)。

 キャラや背景画像はなかなか減らせないからね。こういった工夫も良いかも。実はプログラムよりも画像や音素材の方が何百倍も大きいんだよね。1つ減らせるだけで、どれだけ助かるか・・・。

[Rule Generator Demo]
Applet 版のサンプル(PC[IE]でアクセス)
Android 版のサンプル(Android2.2以降でアクセス)

※シナリオ:月華夜奏さん
※キャラクター画像は「著作権フリー立ちキャラクター素材集」を使用しています。
※背景画像は「きまぐれアフター」と「ぐったりにゃんこ」のフリー素材を使用しています。

著作権フリーキャラクター素材集


(関連記事)
Android と Applet の互換ってできるもんだね

category: プログラミング

thread: ゲーム開発

janre: コンピュータ

tag: グラフィックス 
tb: 0   cm: --


プロフィール

Social

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR

▲ Pagetop