c ++ sqrt保证精度,上限/下限

Lux*_*Lux 16 c++ floating-point floating-accuracy sqrt c++11

我必须检查包含平方根的不等式.为了避免由于浮点不准确和舍入导致的错误结果,我使用std::nextafter()上限/下限:

#include <cfloat> // DBL_MAX
#include <cmath> // std::nextafter, std::sqrt

double x = 42.0; //just an example number
double y = std::nextafter(std::sqrt(x), DBL_MAX);
Run Code Online (Sandbox Code Playgroud)

a)y*y >= x使用GCC编译器保证吗?

b)这是否适用于其他操作+ - * /,甚至std::cos()std::acos()

c)是否有更好的方法来获得上限/下限?

更新:我读过这不是C++标准保证的,但应该按照IEEE-754工作.这适用于GCC编译器吗?

Sim*_*ons 2

对于 GCC,页面建议如果您使用 GCC 内置 sqrt 函数,它将起作用__builtin_sqrt

此外,此行为取决于您编译代码的方式以及运行代码的机器

  1. 如果处理器支持 SSE2,那么您应该使用标志编译代码,-mfpmath=sse -msse2以确保所有浮点运算都是使用 SSE 寄存器完成的。

  2. 如果处理器不支持 SSE2,那么您应该使用long double浮点值的类型并使用标志进行编译-ffloat-store,以强制 GCC 不使用寄存器来存储浮点值(这样做会导致性能损失)