1
#include <stdio.h>
#include <wchar.h> 
int main()
{
    double f = 1717.1800000000001;
    wprintf(L"double      %.20G\n", f);
    return 0;
}

输出(预期如下):

double      1717.1800000000000637
double      1717.1800000000001

这是在 Ubuntu 11.10 x64 上(但也在为 32 位编译时)。

我试图解决的问题是,在 Windows 上,它输出的数字与代码中的数字完全相同,我需要进行低级格式化 (swprintf) 才能像在 Windows 中一样工作,以解决可移植性问题。

4

4 回答 4

2

1717.1800000000001 不能完全表示为 double,所以你只能在 f 中得到一个接近它的值。存储在 f 中的值正好是 1717.180000000000063664629124104976654052734375。

现在的问题是 windows 只输出 17 个有效数字,尽管请求了 20 个(这是一个已知的错误,AFAIK 它在他们的错误数据库中的某个地方)。

如果您不能将字段长度限制为合理的值(如 "%.17G"),则需要一个包装器来模拟此错误。

于 2012-02-29T09:52:07.923 回答
1

wprintf函数是由标准 C 库实现的,而不是由 gcc 实现的。

1717.1800000000001浮点数后有 13 位数字。但是,它没有 64 位二进制浮点格式的精确表示。

格式"%.20G"要求输出 20 位有效数字,即1717.1800000000000637. 因此,这个输出是预期的。Windows 标准 C 库对格式的处理方式不同或舍入不正确。

另一方面,您可以通过使用"%f"格式在浮点之后要求特定数量的数字,例如"%.13f",将输出四舍五入到浮点之后的 13 位,然后1717.1800000000001按预期打印。

于 2012-02-29T09:37:31.380 回答
0
double f = 1717.1800000000001;

这行代码无法准确执行。常量有 17 位十进制精度,双精度有 15.9。

于 2012-02-29T09:39:55.683 回答
0

好吧,您的预期输出与您的格式字符串冲突。“%.20G”意味着你想要 20 个有效数字,这就是你得到的。如果您想要 17 个有效数字,就像您预期的输出一样,请使用“%.17G”。

于 2012-02-29T09:37:46.917 回答