相关疑难解决方法(0)

如果数学移至内联函数,为什么 C++ 舍入行为(对于编译时常量)会发生变化?

考虑以下函数:

static inline float Eps(const float x) {
  const float eps = std::numeric_limits<float>::epsilon();
  return (1.0f + eps) * x - x;
}

float Eps1() {
  return Eps(0xFFFFFFp-24f);
}

float Eps2() {
  const float eps = std::numeric_limits<float>::epsilon();
  const float x = 0xFFFFFFp-24f;
  return (1.0f + eps) * x - x;
}
Run Code Online (Sandbox Code Playgroud)

-O2with中-std=c++20,这两个函数都编译为一个函数,movss后跟一个ret针对 x86 的 using clang 16.0.0 和mov一个bx针对 ARM 的 with gcc 11.2.1。为 ARM 生成的程序集与返回值 ~5.96e-8 一致,但为 x86 生成的程序集则不然。 …

c++ floating-point clang compiler-optimization clang++

7
推荐指数
1
解决办法
257
查看次数

Clang 融合乘加取决于表达式参数的恒定性

如clang 14.0.0 浮点优化的答案所示,自版本 14 起,Clang 即使对于在编译时执行的常量计算也应用融合乘法加法 (FMA) 指令。

同时,我们可以观察到结果取决于表达式参数的形式恒定性:

#include <stdio.h>

int main() {
    const float A = 2.1f;
    const float B = 0.1f;
          float C = 0.1f;
    float V = A * B - A * B;
    float W = A * C - A * C;
    printf( "%g %g", V, W );
}
Run Code Online (Sandbox Code Playgroud)

在 Clang 中,程序打印0 1.49011e-10,在线演示:https://godbolt.org/z/a3fcYG7ob

从汇编代码可以看出, 和V都是W在编译时求值的。是否有一些规则规定只能W使用 FMA 指令进行评估?

添加-mno-fma用于禁用 FMA 指令的命令行选项不会改变结果中的任何内容。

c floating-point optimization clang fma

5
推荐指数
0
解决办法
197
查看次数

求解二次方程的数值稳定方法

使用浮点,据了解,二次公式不会对于b ^ 2 >> 4AC工作得很好,因为它会产生显着的损失,因为它是解释在这里.

我被要求找到一种更好的方法来解决二次方程,我知道有这种算法.还有其他更好的公式吗?我怎样才能想出更好的配方?我试图用代数方式操纵标准方程,没有任何结果.

floating-point numerical-methods

4
推荐指数
2
解决办法
1602
查看次数

比较(a+b)*c和a*c+b*c的计算速度

我刚刚了解到,C 中的加法运算比乘法运算更快。因此,我很好奇(a+b)*c计算速度是否会比 C 更快a*c+b*c

c time-estimation computation-theory

0
推荐指数
1
解决办法
107
查看次数