直接関係はないんだけど,karl(nooon)の(ACE BBSの広告に使われた)40バイトサインテーブルジェネレータを思い出した.ってもう6年前に取り上げたネタですけど!
; the cos table has 1024 values & ranges from -2^24 to 2^24
build_table: lea DI,cos_table
mov CX,1022
mov EBX,cos_table[4]
mov EAX,EBX
@@calc: imul EBX
shrd EAX,EDX,23
sub EAX,[DI-8]
stosd
loop @@caslc
cos_table dd 16777216 ; 2^24
dd 16776900 ; 2 ^24*cos(2a/1024)
dd 1022 dup (?)
ただ取り上げるだけじゃあれなんでこれをCに落とすと,
int cos_table[1024] = {1<<24,16776900};
void build_table() {
__int64 a;
int b;
a = b = cos_table[1];
for( int i=2;i<1024;i++ )
cos_table[i] = b = ((a*b)>>23) - cos_table[i-2];
}
て感じです.imulとshrdはどうしてもうまく表現できないのでint64使ってしまったところが情けないですが,いいアイディアが思い浮かばなかったので.windowsならMulDivとか使えばいいんですけどね.
ちなみに誤差は絶対で30000くらい出ます.相対誤差は浮動小数点じゃないので比べるのが難しいですが(0付近になるとどうしても大きくなる),だいたい0.2%以下です.
生協で8割引だったThe Rolling StonesのライブDVDを見てたんだけど,ミックジャガーさんの動きと格好が凄すぎて笑えてしょうがない.1982年のなんだけど,あの格好はやばい.
けどあんまり曲知らないので途中で飽きてしまった.
(そして修論も進まない)