具有小基数的有效指数

时间:2012-10-16 03:45:36

标签: c math

我需要执行softmax操作。也就是说,给定n个实数值从-inf到+ inf的序列,我通过对每个值进行指数并除以指数之和来将它们转换为概率:

for (i = 0; i < n; i++)
    p_x[i] = exp(x[i]) / sum_exp(x, n)

(不要从字面上理解代码,我不是每次迭代总结所有exp!)

在某些极端情况下,当值超过700时,我遇到溢出问题(使用8个字节的双精度数)。我知道我可以使用另一个基础而不是e,但是,我担心调用pow会比exp慢得多(速度对我来说很重要)。

解决这个问题的最快方法是什么?

2 个答案:

答案 0 :(得分:0)

在64位浮点数中使用每个数字作为52位尾数。这只是掩盖然后铸造的问题。

#include <stdio.h>

int main(int argc, char *argv[])
{
  long long val = 1234567890;
  long long mval = val & ~0xfff0000000000000ULL;
  float fval = *((float*)&mval);
  printf("%f", fval);
}

答案 1 :(得分:0)

b^x = e^(x * ln b)

因此,使用较小的基数b相当于在应用ln b之前将您的值乘以exp,并在结束时再次划分。