東方龍神録C++版のコードについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
sql

東方龍神録C++版のコードについて

#1

投稿記事 by sql » 11年前

東方龍神録のC++版のコードをDLして見てみたのですが、コメントが書かれておらず理解に苦しんでいる箇所があるので教えてもらいたいです。
Util.cppの中に

コード:

float round_f(float fVal, int sN){
    float fAns;
    fAns = fVal * pow(10.f, +sN-1 );
    fAns = (float)(int)(fAns + 0.5f);
    return fAns * pow(10.f, -sN+1 );
}
という箇所があります。
どうやらFpsのコントロールで使用されているらしいです。
コードの一部

コード:

void CFpsCtrl::UpdateFps(){
	int sListLen = (int)m_List.size();
	if( sListLen < LIST_LEN_MAX ){
		return;
	}
	int sActuallyTookTime = m_List.back() - m_List.front();
	float fAverage = (float)sActuallyTookTime / (sListLen-1);
	if( fAverage == 0 ){
		return;
	}
	m_fFps = round_f( 1000 / fAverage, 2 );
}
この「round_f」という関数について、1行ずつ説明して欲しいです。推測できるなら引数の英語は何を略したものなのかも・・・
お願いします。

Poco
記事: 161
登録日時: 14年前

Re: 東方龍神録C++版のコードについて

#2

投稿記事 by Poco » 11年前

名前からして小数の四捨五入かと。
第2引数が小数点第何位を四捨五入するかと指定しているのだと思います。

アバター
milfeulle
記事: 47
登録日時: 11年前
住所: マリーランド
連絡を取る:

Re: 東方龍神録C++版のコードについて

#3

投稿記事 by milfeulle » 11年前

float fAns;
まず32bitの浮動小数点fAnsをスタックに確保します。

fAns = fVal * pow(10.f, +sN-1 );
次に引数で与えられたfloat型のfValに10の(sN-1)乗を掛けます。例えばsN = 3なら10の2乗 = 100を掛けます。

fAns = (float)(int)(fAns + 0.5f);
10の累乗倍されたものに0.5を足し、int型に変換し小数点以下を切り捨てます。そしてfloat型にして浮動小数点型に戻します。例えばfVal = 1.2345, sN = 3なら123.45 + 0.5 = 123.95→123.0となります。fVal = 6.789なら、678.9 + 0.5 = 679.4 → 679.0となります。

return fAns * pow(10.f, -sN+1 );
最後に10の累乗倍の逆数倍して元と同じオーダーに戻します。sN = 3なら1/100します。上記の例だと1.2345→1.23, 6.789→6.79となります。(10^k倍したあとに10^[-k]倍すれば10^0倍になり変わりません)

このようにして小数点以下sN+1桁を四捨五入して小数第sN位までの数を返す関数のようです。
ζ*'ヮ')ζプログラミングはみんなで奏でるシンフォニー

sql

Re: 東方龍神録C++版のコードについて

#4

投稿記事 by sql » 11年前

milfeulleさん、Pocoさんありがとうございます。milfeulleさんは丁寧に書いて下さり本当に助かりました。

閉鎖

“C言語何でも質問掲示板” へ戻る