lua for AviUtl を ver 0.0.11 に更新しました。
AviUtl プラグイン フィルタ by うえぽん
以前ブログで「lua for AviUtlをGPU使用プラグインと一緒に使うとクラッシュしていたのを修正」というのを書きましたが、それに関連する話です。
Luaの数値型はdoubleで処理しているわけですが、GPU使用プラグインと併用すると、その数値精度がfloat相当になってしまう現象に遭遇しました。
doubleなら仮数部が52bitあるのでC言語などの32bit整数型との互換を保てるのですが、しかし、floatだと仮数部が22bitなので32bit整数型の数値をすべて表現することができません。
例えば 65535 × 65534 の答えはdoubleなら表現できますが、floatになっていると近似値になってしまいます。
原因は、DirectXのライブラリがFPU(浮動小数点を演算するCPUの回路)の演算精度を下げているためです。
なぜ下げるかというとその方が演算速度が速くなるからだそうです。
回避方法としては、CreateDeviceの呼び出し時にD3DCREATE_FPU_PRESERVEをセットするという方法があるそうですが、他のプラグイン作者が手を出せるものではありません。
というわけで「lua for AviUtl」では別の回避方法として、自プラグインに処理が回ってきたら一時的にFPUの演算精度を上げ、処理が済んだら元に戻すという方法で問題を回避することにしました。
【参考ページ】
空想具現化プログラミング [Lua] Luaの数値型の精度の問題
float vs. double
AviUtl プラグイン フィルタ by うえぽん
以前ブログで「lua for AviUtlをGPU使用プラグインと一緒に使うとクラッシュしていたのを修正」というのを書きましたが、それに関連する話です。
Luaの数値型はdoubleで処理しているわけですが、GPU使用プラグインと併用すると、その数値精度がfloat相当になってしまう現象に遭遇しました。
doubleなら仮数部が52bitあるのでC言語などの32bit整数型との互換を保てるのですが、しかし、floatだと仮数部が22bitなので32bit整数型の数値をすべて表現することができません。
例えば 65535 × 65534 の答えはdoubleなら表現できますが、floatになっていると近似値になってしまいます。
原因は、DirectXのライブラリがFPU(浮動小数点を演算するCPUの回路)の演算精度を下げているためです。
なぜ下げるかというとその方が演算速度が速くなるからだそうです。
回避方法としては、CreateDeviceの呼び出し時にD3DCREATE_FPU_PRESERVEをセットするという方法があるそうですが、他のプラグイン作者が手を出せるものではありません。
というわけで「lua for AviUtl」では別の回避方法として、自プラグインに処理が回ってきたら一時的にFPUの演算精度を上げ、処理が済んだら元に戻すという方法で問題を回避することにしました。
【参考ページ】
空想具現化プログラミング [Lua] Luaの数値型の精度の問題
float vs. double