论 C++ 中 double 类型的优化问题

发布时间 2024-01-09 19:08:08作者: Mayile1022

是这样的,我在 OI 出题中,std 习惯使用 double,但是求解,在大数据的情况下用 long double,小数据用 double

虽然这样也没什么问题,但是在 std 中我是不开启 -O2 的,但洛谷的环境是默认 -O2 的。然后有一次我再核对 std 时,我发现 double 在 O2 和不 O2 的情况下,大数据的结果是不一样的,可以给一个例子。

测试代码:

#include <bits/stdc++.h>
using namespace std;

int main(){
    long double x;
    double dx;

    cin >> x;
    cin >> dx;

    x += 114514.1919;
    dx += 114514.1919;

    printf("LONG DOUBLE: %Lf\nDOUBLE: %lf", x, dx);
}

输入:

15151578734687
15151578734687

输出:

LONG DOUBLE: 15151578849201.191900
DOUBLE: 15151578849201.191406

经过测试,在开不开启 O2 的情况下,double 都会出现问题。

所以,在大数据的情况下,为了精度, long double 是更好的选择。

经过更多的测试后,发现 double 在代码复杂性较低的情况下,优化产生的误差较小,但在复杂度高的情况下,误差可能会达到 \(10^3\)

所以推荐使用 long double。就酱紫。我也不会复杂的,这是一个应对方法。