「なぜpngファイルから詳細な値が取り出せるのか」
どんすこあ!で生成された譜面画像には、ステガノグラフィーという手法で画像にテキストデータが埋め込まれているからです。
reverse.exeから得られるtxtファイルは、譜面画像作成者が画像を生成する際に用いたテキストデータになっています。
「なぜ1.0099999904632568359375のような値になるのか」
端的に言うと、"ゲーム内部で扱われている値を正確に表現するとこうなる"からです。
ご存知の通り、コンピューターでは情報は全て2進数で扱われています。そのため、譜面のBPMやHSといった小数値も全て2進数で扱われています。(質問の中で出てきた単精度浮動小数点数というのがそれですね)
例えばになりますが、1.01という10進法の小数を2進法で表したいとします。
すると「1.0000001010001111010111000010100011110101110000...」のように無限に続く循環小数になります。
(10進数でも、1/3という分数を小数で表そうとしたら0.3333333333...のような循環小数になりますが、それと似たようなものだと思ってくだされば大丈夫です)
ただしコンピューター上で扱える桁数には限界があるので、「1.000000101000111101011100」のように途中の桁以降の情報が欠落してしまいます。
そのため、この値を元の10進法に戻そうとすると「1.0099999904632568359375」のように元々の値から少しズレた値になってしまうという訳です。
通報 ...
(追記)あくまでこの説明は、2進数における小数の表現方法について理論的に説明したものなので、実際の単精度浮動小数点数における数の扱い方とは若干異なる部分があります。その点はご了承ください。
とてもわかりやすい解説に心より感謝いたします。つまるところ、ステガノグラフィーというコンピューター言語に変換した際に値が2進法で表されるため、10進法への変換時に近似値になるという認識で正しいしょうか。あるいはそもそもの内部データが2進法で書かれていることに由来しているのでしょうか。BPMやHSはフレームレートに基づいて(10進法で)計算されていると聞いたので疑問です。また追加の質問で、「1.0099999904632568359375」のようにズレた値になってしまうものを非循環数である「1.01」に戻すような技術もしくは計算式などは存在するのでしょうか。直接の計算では不可能としても毎回同じ数列が出現すると思うので統計的には可能なように思えます。
(後半訂正)直接の計算では不可能としても、普段使われるような小数第2位程度の数値ではズレた値に毎回同じ数列が出現すると思うのでパターンの統計的には不可能ではないように思えます。
>> 1352>> 1353
ステガノグラフィーについては、画像からどうしてテキストファイルが得られるのかについて説明しただけなので、なぜ値が1.009999...のようになるかとは関係が無いですね。
(あくまで画像作成者が生成時に打ち込んだデータそのものが取り出せるだけなので、「画像作成者が1.009999...というように打ち込んで生成した」ということに過ぎないです)
「なぜpngファイルから詳細な値が取り出せるのか」に対する回答と「なぜ1.0099999904632568359375のような値になるのか」に対する回答は完全に分離しているものとお考えください。
「BPMやHSはフレームレートに基づいて計算されていると聞いたので疑問です」
今回の説明は"ゲームデータの内部解析によって作成された譜面画像についての説明"なのでこのようになります。
データ解析によって作成された画像ではなく、ゲームのキャプチャ映像から計測によって作成された画像ならば、値の計算は人間が10進法で行っているだけなので普通の値になります。
(データ解析によって作成された「解析譜面」に対して、キャプチャ映像より計測で作成されたものは「暫定譜面」と呼ばれることもあります)
つまり、「1.0099999904632568359375のような値が出てくるのは基本的に解析譜面だけ」という事ですね。
(長くなってしまったので分割します)
「元々の10進数の値を逆算することは出来るか」
一般的に言えば、一部の情報が完全に欠落してしまっているので完全に戻すことは難しく、ある程度の推察までしか出来ません。
例えば、「111.111111」と「111.111118」を単精度浮動小数点数で表すと、内部的にはどちらも「111.111114501953125」になります。(つまり有効桁数に限界(10進法で7~8桁程度)があります)
ただしHS値に関して言えば、基本的に実質小数点以下2桁までしか指定されておらず有効桁数が少ないため、小数第三位を四捨五入すれば元々の10進数の値になります。
BPM値に関しては有効桁数が多いため完全に戻すことは難しいと思われます...
非常に興味深い知見を得ることができました。解説も掘り下げていただき心より感謝申し上げます。ステガノグラフィーも色やアルファ情報のようなものを想像していたところ、調べてみるとデータそのものに暗号化が組み込まれ人間は完全に判別できない技術もありとても面白いです。最後に、その名称からゆくゆくはすべてが「解析譜面」に置き換わる流れと思いますが、「解析譜面」および「暫定譜面」の管理はこのWikiでどのように行われているのでしょうか。(いつのまにか「解析譜面」に更新されていた!を見逃さずにキャッチする方法があればお聞きしたいです。)
解析譜面か否かは基本的に譜面画像のファイル名を確認することで判断できます。
解析譜面は主に「(曲ID)_(難易度名).png」というファイル名になっています。(難易度名は、かんたん~おに・おに裏の順に、e,n,h,m,xのアルファベット1文字)
この命名規則に則っていれば基本的に解析譜面だと思って頂いて大丈夫です。(ただ、こういう明確なルールが決められている訳ではなく、あくまでWiki編集者内での暗黙のルールであることにご留意下さい)
なお、恐らくこの暗黙のルールが生まれるよりも前に作られたであろう画像においては、解析譜面であってもこの命名規則に則らない場合もあります。
また、解析譜面か否かについてWiki内で一括管理等はされている訳ではないので、解析されているかどうかは都度自分で確認する必要がありますね。
(ただ最近の傾向としては、ページ内に曲IDの表記がされていれば大抵は解析譜面が載せられている事が多いように思います)
ありがとうございます!!!