【问题标题】:long double gives wrong result when compiled with MinGW [duplicate]使用 MinGW 编译时,long double 给出错误结果 [重复]
【发布时间】:2024-01-09 12:41:01
【问题描述】:

当我将 long double 类型更改为 double 时,它运行良好。问题是我需要更高的精度,但我不知道为什么使用 long double 我有 -1 作为解决方案。

typedef long double big_num_t;
typedef unsigned int un_i;

long double suite(big_num_t x, big_num_t a2n_1, un_i n) {
    return ((-1) * ((a2n_1 * (2 * n - 1)) / (n * (2 * n + 1))) * (x * x));
}

int main() {
    big_num_t summ = 3;
    big_num_t temp = 3;
    for (un_i n = 1; n < 100; ++n) {
        temp = suite(3, temp, n);
        summ += temp;
    }
    summ *= (M_2_SQRTPI);
    printf("%Lf", summ);
    return 0;
}

谢谢 ;)

【问题讨论】:

  • 在我的系统上使用 clang 和 gcc 编译你的示例都产生 0.999978 而不是 -1
  • 还要注意long double 可能与double 具有相同的精度。这适用于 Visual Studio,例如:msdn.microsoft.com/en-us/library/s3f49ktz.aspx
  • 我的系统上也有 0.999978。这是打印问题吗?或许您可以添加:if (summ &lt; 0) printf("less zero") else printf("not less zero"); 看看这是否与打印的值一致。
  • 好吧,我在带有 MinGW 的 Windows 上使用 Clion。我现在切换 tu linux 看看它是否更适合 gcc。

标签: c double mingw


【解决方案1】:

好吧,我用默认的 gcc 在 linux 上尝试过,问题也很相似。看起来如果您想使用更高的精度,您必须使用外部库或自己实现您的算法。 Gmp lib 非常适合。但如果 C 开发人员或 Iso 或其他任何选择一个标准,那就太好了......

【讨论】:

    【解决方案2】:

    如果您需要的不仅仅是一个双精度数,即 8 个字节,一个 int 或 char 数组,并为这种类型创建您自己的算术。这是确保您能够存储数字的唯一方法,因为这样您不必担心数字大小,因为至少在 gcc 中,long double 和 double 都是 8 字节,因此两者都存储相同的数字限制。

    【讨论】:

    • 是的,我认为你是对的。奇怪的是,如果我打印存储它们具有不同的值,但是就像 gcc 甚至 minGW 一样,它们并不关心并将它们视为普通的双打。 (不是 printf 函数的问题)。无论如何谢谢;)