gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:22:12 27 4
gpt4 key购买 nike

我必须检查一个包含平方根的不等式。为了避免由于 float 不准确和舍入导致的不正确结果,我使用 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);

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

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

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

更新:我 read C++ 标准不保证这一点,但应该根据 IEEE-754 工作。这适用于 GCC 编译器吗?

最佳答案

一般来说,浮点运算会产生一些 ULP错误。 IEEE 754 要求大多数操作的结果在 0.5 ULP 范围内是正确的,但错误可能会累积,这意味着结果可能不在精确结果的一个 ULP 范围内。精度也有限制,因此根据结果值中的位数,您也可能不会使用相同大小的值。超越函数也有点notorious用于在计算中引入误差。

但是,如果您使用的是 GNU glibc , sqrt 将在 0.5 ULP(四舍五入)内正确,因此您的具体示例将起作用(忽略 NaN+/-0+/-信息)。虽然,最好将一些 epsilon 定义为您的容错并将其用作您的界限。例如,

bool gt(double a, double b, double eps) {

return (a > b - eps);
}

根据您在计算中所需的精度级别,您可能还想使用 long double

所以,回答你的问题...

a) Is y*y >= x guaranteed using GCC compiler?

假设您使用 GNU glibc 或 SSE2 内部函数,是的。

b) Will this work for other operations like + - * / or even std::cos() and std::acos()?

假设您使用 GNU glibc 和一个操作,是的。虽然有些超越数不能保证正确四舍五入。

c) Are there better ways to get upper/lower bounds?

您需要知道计算中的误差容限是多少,并将其用作一个 epsilon(可能大于一个 ULP)。

关于c++ sqrt保证精度,上限/下限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32208020/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com