【问题标题】:Looking for good scale factor for converting log to 8.8 fixed point寻找将日志转换为 8.8 定点的良好比例因子
【发布时间】:2016-10-12 14:33:00
【问题描述】:

我在(0, 1]中有一系列数字

我想取这些数字的自然对数,然后存储为 8.8 固定点。

我的论坛是K*ln(x) + (1<<16)

但我不确定 K 的最佳价值是什么。

我的想法是如果x翻倍,那么ln(x)增加ln(2),所以定点值应该在定点增加1(即256)

所以,这意味着K = 256/ln(2)

这有意义吗?

【问题讨论】:

  • 那会是Q8.8 与 8 位整数和 8 位小数部分相同的 16 位数量吗? (1 << 16) 是否意味着将负数转换为正数?如您所知,ln(0) 本质上是负无穷大,因此如果您的大多数数字都来自 (0, 0.01] 范围,那么您可能会选择与大多数数字来自 (0.9, 1] 范围的情况不同的比例。您是否有关于分发的详细信息或类似信息来决定您宁愿放弃哪些信息?
  • 谢谢。是的,是 Q8.8。但是,我不确定数字范围遵循什么样的分布。
  • 一些示例输入和预期结果将有助于澄清。

标签: math fixed-point natural-logarithm


【解决方案1】:

随着 x 接近 0,ln(x) 将发散到负无穷大。因此,您实际上是在尝试将无限域映射到有限范围。

如果你以线性方式这样做,你必须在某个时候切断。如果您选择的截止值太低,您将浪费您所代表的数字的精度。如果您选择较高的截止值,太多的值将被限制在范围的最小元素上。如果不了解该点的分布情况,将很难在这里猜测出合适的平衡点。

因此,也许您可​​以应用非线性地图,而不是您建议的线性地图。类似于指数函数的东西?这意味着您实际上会存储 x 而不是 ln(x)。所以我想说,如果你想以 16 位存储来自 [0,1) 的值而不会丢失太多信息,你只需使用 Q0.16,即小数部分中的所有数字。对于 (0,1],您可以存储 1 − x 或为 x = 1 做一个特殊情况,以便将其编码为 0。如果你有 Q8。 8 个数字,您可以先将数字乘以 28 = 256,但如果您可以访问位表示,那么乘法将是浪费时间。

我猜你有一个你想要存储对数的原因,所以这个答案可能不是你所希望的。不过,我没有看到解决潜在问题的更简单方法,因此您可能需要重新考虑您的一些想法。

【讨论】:

    猜你喜欢
    • 2010-10-24
    • 1970-01-01
    • 2014-10-25
    • 2016-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多