プログラミングの為の数学と算数 vol.2at TECHプログラミングの為の数学と算数 vol.2 - 暇つぶし2ch■コピペモード□スレを通常表示□オプションモード□このスレッドのURL■項目テキスト816:815 07/04/29 00:24:22 >>815の続きです^^ 例えば、src=0, dst=255, rate=255の場合、 結果としては0が期待されますが、実際に計算してみると 1) tmp = -255 = 0xff01 2) tmp = (short)(0xff01 * 0xff) = (short)0xfff01ff = 0x01ff 3) tmp = 0x01 4) result = (byte)(0xff + 0x01) = 0x00 となり正しい結果が得られます。 また、src=200, dst=225, rate=200の場合は、 204程度が望まれますが、実際に計算してみると 1) tmp = -25 = 0xffe7 2) tmp = (short)(0xffe7 * 0xc8) = (short)0xc7ec78 = 0xec78 3) tmp = 0xec 4) result = (byte)(0xe1 + 0xec) = 0xcd = 205 とほぼ正しい結果が得られます。 上の式は有名なライブラリで使われている式でもあり、 正しいことはほとんど保証されているのですが、 これがなぜ正しいのか証明できる方はいませんか? 少なくとも自分には理解できないです。 文献でもいいです。よろしくお願いします。 817:デフォルトの名無しさん 07/04/29 00:48:54 >>815 どうしてもなにも、定義そのままの計算式じゃん。 > 1) short tmp = (short)src - (short)dst; //< 符号付き2バイト数に拡張します (src-dst) は、-255~+255 なので、short に納まる。 > 2) tmp = (short)(tmp * rate); //< 演算結果の下位2バイトを結果として受け取ります (src-dst)*rate は、-65280~+65280 なので、2の補数で17ビット必要→shortだと1bit足りない→後述 > 3) tmp = (word)tmp >> 8; //< 無符号型としてシフト() ((src-dst)*rate)>>8 は -255~+255なので、2の補数で9ビット必要だが、2)の時点で9ビット目の情報は落ちている > 4) byte result = (byte)(dst + (byte)tmp); ここで、8ビット整数で計算するのだから、上記3)の所で、結果は8ビットあれば十分。9ビット目の値は要らない。 8ビットで演算するのに「-1(0xff)を足す」のも「255(0xff)を足す」のも、まったく同じ結果になることに気付けばOK。 3)の結果で、-255 が出てきたのを、+1 として処理してもまったく問題ない。 → -255~-1 を +1~+255 で処理しても結果は同じ。 次ページ最新レス表示レスジャンプ類似スレ一覧スレッドの検索話題のニュースおまかせリストオプションしおりを挟むスレッドに書込スレッドの一覧暇つぶし2ch