プログラミングの為の数学と算数 vol.2at TECHプログラミングの為の数学と算数 vol.2 - 暇つぶし2ch■コピペモード□スレを通常表示□オプションモード□このスレッドのURL■項目テキスト935:デフォルトの名無しさん 07/06/11 09:17:25 あってるかといわれても、そういう定義を選ぶかどうかの問題では? 936:デフォルトの名無しさん 07/06/11 09:22:46 少なくとも31で割るのは間違ってるとは言える 937:デフォルトの名無しさん 07/06/11 09:37:51 0と31を含めるのなら、それで32段階では? 938:デフォルトの名無しさん 07/06/11 14:42:47 32で割ってから1足す方が良いですね 939:デフォルトの名無しさん 07/06/11 15:28:54 ええと 32で割るというのは、何を割るのでしょうか? 入力をXとして trunc( (X-最小値) / (最大値-最小値)* (32-1)) とやるか round( (X-最小値) / (最大値-最小値)* 32 ) とやるか という話? 940:デフォルトの名無しさん 07/06/11 15:36:42 量子化後の値域が [0 .. 31] なのか [1 .. 32] なのか [0 .. 32] なのか 941:デフォルトの名無しさん 07/06/11 17:15:56 X[0.0 ~ 2.0]の値を取る小数点数をY[0 .. 31]の整数型に量子化することを考える。 普通に考えると、こうなる。 (1) Y = trunc(X * 32 / 2.0) (X が 2.0 を含まない場合) (2) Z = X * 31 / 2.0, Y = trunc(Z) (X が 2.0 を含む場合) (3) Z = X * 31 / 2.0, Y = trunc(Z + 0.5) ((2)だとXがきっかり2.0のときしかYが31にならないので少し改良) X が 2.0 を含まない場合は全く問題ない。 しかしそうで無い場合は、(3)を使っても 0.0 <= Z < 0.5 → Y = 0 0.5 <= Z < 1.5 → Y = 1 30.5 <= Z <= 31.0 → Y = 31 (Zの最大値は31のため) つまりY=0, 31の場合だけ、とれるZの範囲が半分になってしまう。 この場合の量子化を正確に行うのは少し難しい。 改良案として、 Z = X * (32 - delta) / 2.0 (deltaは適度に小さい数。Xが整数値ならdelta = 1) Y = trunc(Z) としてYを計算する方法がある。 つまり、0.0 <= X <= 2.0 の値を 0.0 <= Z <= 31.99999... に写像してしまえばいい。 もう一つは、X = 2.0 や Y = 32 の値だけを特別扱いする。 つまり、 Y = trunc(X * 32 / 2.0) if (Y == 32) Y = 31 (Y -= (Y >> 5)) としてしまう方法もある。 次ページ最新レス表示レスジャンプ類似スレ一覧スレッドの検索話題のニュースおまかせリストオプションしおりを挟むスレッドに書込スレッドの一覧暇つぶし2ch