質問: お疲れ様です。 C環境で、ガンマ補正関連の画質処理を作成しているのですが、 速度をなるべく早くするということでMath.hを禁止され、 どのようにべき乗計算をするか分からない状態であり、 もしこうして解決したなどの経験がございましたらご教授ください。 **【実行したいこと】** ガンマ2.2などの画質変換用のLutテーブル作成 **【Math.hがあれば実装していたであろう内容】** 1ガンマ2.2の画像のガンマを外す =(Y / Y最大値) ^ (2.2) 2ガンマ2.2に再度なおす =(1の結果) ^ (1.0 / 2.2) * Y最大値 //// =(Y) ^ (1.0 / 2.2) * Y最大値 **//間違い** ※このべき乗をpowでやる予定でした。 --- <追記> ・YおよびYの最大値は整数になります。10bit 0-1023になります。 ・ガンマ値は固定値で、ガンマ2.2、ガンマ1.8、ガンマ2.6で変換をかける予定です。 ・「速度 > 精度」の優先順位になっています。 ・2の式が間違っていたので修正いたしました。 1と2は基本ワンセットになっていると思ってください。(片方だけ実行することはない) 以上、よろしくお願いいたします。
回答: Optimized pow() approximationのコードは如何でしょうか。 ``` double fastPow(double a, double b) { union { double d; int x[2]; } u = { a }; u.x[1] = (int)(b * (u.x[1] - 1072632447) + 1072632447); u.x[0] = 0; return u.d; } ```