增强算术运算 (IEEE-754-2019):输出定义和实现

计算科学 C 浮点
2021-12-02 07:31:03

在新版IEEE-754-2019: IEEE Standard for floating-point algorithm中,引入了增强的算术运算。这些操作在某些数值方案中可能特别有用。

在论文“The IEEE Standard 754: One for the History Books”(也可在此处获得)中对其进行了描述,如下所示:

IEEE 标准 754-2019 最有趣的新特性是增强的算术运算。这些提供了加法、减法或乘法的精确结果,两部分相加得到精确结果。

据我了解,这意味着 IEEE-754-2019 算法的实现必须同时计算操作的值 (1) 和引入的错误 (2):

(1)fl(xy)

(2)fl(fl(xy)(xy))

在 (1) 和 (2) 中,fl(x)表示舍入映射一个实数x进入浮点数集合,并且表示支持的增强算术运算。

这意味着增广算术运算必须返回两个值。我想知道我的理解是否正确,并且(2)是正确的。它是 IEEE-754 中第一个有多个“返回”的操作吗?

如果这是正确的,那就意味着在类 C 语言中它只能作为一个过程来实现:

augmentedArithmOperation(x, y, &res, &error);

因为return不支持 ing 几个输出参数。

1个回答

C 不允许多次返回,但结果可以打包到一个结构中。

struct augmented_double {
    double head;
    double tail;
};

struct augmented_double augmented_add(double, double);
struct augmented_double augmented_multiply(double, double);

您可以对任何返回多个值的函数执行此操作,这很麻烦,因为您需要为每个执行此操作的函数的返回类型单独声明一个新结构。在 C++11 中,您可以只返回一个 std::tuple。据我所知,大多数现有的增强算术实现都使用您所展示的 API,将结果写入指针参数,但这并不意味着它是唯一的方法。此外,新的浮点标准指定符合要求的实现必须提供增强的算术,而不是现有算术运算的行为需要改变。您可能永远无法将其与常规的 old+*运算符一起使用。

或者,在具有 SSE2 指令的 x86 系统上,可以将结果写入 SIMD 类型,如__m128d,您可以对其进行 typedef 以augmented_double表示预期用途。

希望 C 语言标准的C2x修订版将包括对增强算术的支持。在这种情况下,新标准需要:

  • <float.h>在标题中添加增强浮点数的类型
  • 定义增广算术运算
  • 定义辅助函数以提取头部和尾部
  • 进行所有必要的平台自省以确定如何最好地表示增强的 FP 类型

最后一步是编译器编写者将决定在具有 SIMD 寄存器的系统上表示增强的 FP 类型,__m128d在没有 SIMD 寄存器的系统上表示为具有两个双精度的结构。