本文尝试改进log10查表法,进一步增强log10计算效率。
https://godbolt.org/z/TW5aPo4cc
它的核心是把float 的exponent和小数部分拆开分别查找这两部分对应的log10的对数值,并相加。它借助了以下公式: log10(x * y) = log10x + log10y
下面是单精度float的表示方法 $$ Float = S*2^{Exponent-127}*\left( 1.0+\frac{frac}{(1\ll23-1)} \right) $$ 符号位S暂时不考虑。 Exponent是指数部分 frac是尾数 上面公式中的x=2^{Exponent-127}, y=(1.0+frac/(1<<23 - 1))
这里有两点可以优化: - 表格可以在编译阶段计算 - 改成log2可以减少一张表格 实现代码如下在这里: https://godbolt.org/z/4qW7hWP3n
==log2 + 查1张小数表是目前的最优解了==
benchmark: Quick C++ Benchmarks (quick-bench.com)