跳转至

x86

Intel x87 FPU 浮点数运算性能异常分析

浮点数乘法的性能异常

在《数据结构基础》课程 Project 1 中,我们需要评估一段计算幂运算代码的运行耗时,以此分析它的时间复杂度。幂运算的算法相对比较简单,下面是一段示例代码:

double pow(double init_val, uint64_t iteration) {
  double mx = init_val;
  for (uint64_t i = 1; i < iteration; i++) mx *= init_val;
  return mx;
}

从代码中我们可以推出其运行时长应该只与 iteration 变量线性相关,对应该算法复杂度为 \(O(N)\).

然而一部分同学在进行实验时,发现这段代码的运行耗时不仅与幂次方有关,还与底数 init_val 有关。更具体而言,当底数比较大时,性能会发生骤降,比如计算 \(1.5^n\) 会比 \(1^n\) 慢十几倍。

在讨论过程中,同学们初步推断出,由于幂函数增长速度很快,计算较大底数时,很快就会超过 double 类型能表达的数字上限,此时结果将会变为 inf。因此问题的本质不在于底数的选择,而在于运算过程中是否发生了上溢 (overflow) 的问题,如果发生了上溢,那么性能就会骤降。