【发布时间】:2019-06-07 07:09:43
【问题描述】:
%g 说明符的行为方式似乎与大多数来源记录的行为方式不同。
根据我发现的大多数来源,在使用 printf 说明符的多种语言中,%g 说明符应该等同于 %f 或 %e - 以提供的输出较短的为准价值。例如,在撰写此问题时,cplusplus.com says 表示 g 说明符的含义是:
使用最短的表示:
%e或%f
PHP manual says 的意思是:
g - %e 和 %f 的较短者。
而 here's a Stack Overflow answer 声称
%g使用最短的表示。
而a Quora answer 声称:
%g打印这两种表示中最短的数字
但这种行为并不是我在现实中看到的。如果我编译并运行这个程序(作为 C 或 C++ - 这是一个在两者中具有相同行为的有效程序):
#include <stdio.h>
int main(void) {
double x = 123456.0;
printf("%e\n", x);
printf("%f\n", x);
printf("%g\n", x);
printf("\n");
double y = 1234567.0;
printf("%e\n", y);
printf("%f\n", y);
printf("%g\n", y);
return 0;
}
...然后我看到这个输出:
1.234560e+05
123456.000000
123456
1.234567e+06
1234567.000000
1.23457e+06
显然,%g 输出与上述x 或y 的%e 或%f 输出不完全匹配。更重要的是,%g 看起来也没有最小化输出长度;如果y 像x 一样没有以科学记数法打印,那么y 的格式可以更简洁。
我上面引用的所有消息来源都是在骗我吗?
我在支持这些格式说明符的其他语言中看到了相同或相似的行为,这可能是因为它们在底层调用了 printf 系列 C 函数。例如,我在 Python 中看到了这个输出:
>>> print('%g' % 123456.0)
123456
>>> print('%g' % 1234567.0)
1.23457e+06
在 PHP 中:
php > printf('%g', 123456.0);
123456
php > printf('%g', 1234567.0);
1.23457e+6
在 Ruby 中:
irb(main):024:0* printf("%g\n", 123456.0)
123456
=> nil
irb(main):025:0> printf("%g\n", 1234567.0)
1.23457e+06
=> nil
控制这个输出的逻辑是什么?
【问题讨论】:
标签: c floating-point language-agnostic printf format-specifiers