制作日記

こういうの作った方が、逃げにくいじゃない

オキ氏の日記読んでて

気になったとこでも

ceil((2*1.0)**X)でも良いみたいね とにかくfloat値にすれば正常になるって感じ
…という事はもしかしてlifeの%算出も変数無しでいけるんじゃないか?やってみよう

キタ―(゚∀゚)―!!! life(%)算出を変数無しで出来たぞぉー!
(life/lifemax);←算出されない
((life/lifemax)*1.0);←算出されない
((life*1.0)/(lifemax*1.0));←算出される!
(life/(lifemax*1.0));←算出される!
((life*1.0)/lifemax);←算出される!

これで一々敵のlife等を変数化させる必要は無いんですね!?
嬉しい!嬉しいよぉ…!
てか何でlifeかlifemaxのどちらかでも1.0かけたら算出されるんだろ?意味不


一応前半部分の補足
float値の有効桁数は6桁だっけ?なので、それより大きくなる累乗を計算するときは使えないかも

後半部分
基本的に計算結果は計算式に含まれる数値の型で求められます
int同士の演算なら結果もint、float同士なら結果もfloatって感じで
displaytoclipboardなんかはどうにかして%dにcharを渡しても内部的にはintに拡張されてます
printfとかと仕様が変わってなければの話だし、MUGENではintとfloatしか扱えないけど

なら、intとfloatの演算があった場合はどうなるのか?
実は暗黙的な型変換ってのが行われています
計算される前にどちらかの型に勝手に型変換されるのです
型変換される方向は基本的に範囲が大きい方です
MUGENにはintとfloatしか存在しないから、floatに型変換されるってことですね

プログラムなんかには明示的型変換ってものあります
文法は色々ですが、(float)lifeみたいな感じで
MUGENにはそんなのないので、明示的型変換を暗黙的型変換で代用してやる必要が出てくるわけです

((life*1.0)/lifemax);←算出される!
この例だと、lifeに1.0掛けることで、lifeをfloatに型変換してるわけです
さて、これらの演算が行われる順番ですが、結合規則より*→/です
つまり*でfloatに型変換した後に、それをlifemaxで割ることで/の結果もfloatで得られるわけです

((life/lifemax)*1.0);←算出されない
この例で算出できないのは演算子の結合規則の問題ですね
型変換等は一度に計算式全体に対して行われるわけではありません
一つずつ計算しつつ順番に行われていきます
結合規則より演算の順番は/→*ですので
/はint型同士なので結果もint、それに1.0を掛けることでfloatに型変換
という順序になるわけです
なので、求めたい値を正確に算出できないわけです

trackback


この記事にトラックバックする(FC2ブログユーザー)

まとめteみた.【オキ氏の日記読んでて】

気になったとこでもceil((2*1.0)**X)でも良いみたいねとにかくfloat値にすれば正常になるって感じ…とい応前半部分の補足float値の有効桁数は6桁だっけ?なので、それより大きくなる累乗を計算するときは使えないかも後れる数値の型で求められますint同士の演算なら結果も...

コメントの投稿

非公開コメント

プロフィール

Author:drab
霊夢改変キャラ
「12 3 ! {V} [_]」
公開中
L霊夢でもl_reimuでも好きなように読んでください

最新記事
最新コメント
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク