这道题中 C++ “默认精度”的问题
查看原帖
这道题中 C++ “默认精度”的问题
73032
日居月诸lucejx楼主2022/8/7 12:16

首先这不是题解 qwq,是与题意无关的输出机制解释。(狗头保命)

某种原因机缘巧合地碰到了这题,感觉很奇怪,所以查了点资料。

本题所说的 C++ cout 输出默认精度,是一种最小宽度输出,大部分情况下不等同于保留有效数字。以下两种方法是相同的:

double f = xxx;//一个浮点数
cout << f << endl;

以及

double f = xxx;//一个浮点数
printf("%g\n", f);

何为最小宽度输出?

这种输出结合了两种输出方式(以下给出)的优点,选择两种输出方式中占用宽度最小的输出。

第一种是小数输出,不过和 %lf 的效果有点区别,即直接按照一般的小数表示方法输出。一般来说保留六位有效数字,但要注意会截去末尾没有影响的若干个 0。比如 3.41240 尽管已经是六位有效数字,但按照这种方法会输出 3.4124。

第二种是指数输出,和 %e 的效果相近,用1.4e5 这样的形式表示 1.4×1051.4\times 10^5,这样。


综上,cout 默认输出浮点数,以及 printf("%g", f) 的方式不可与“保留几位有效数字”划等号。如果不加说明,很有可能出现不合标准的错误。


希望所有有浮点数输出的题目做到以下两点之一:

1)题目明确规定保留小数位数(而不是有效数字),这时选手可以用 coutprintf 的格式化输出功能;

2)题目使用 special judge 判断答案准确性。这时选手应注意使用 printf("%lf\n", f) 进行输出,而非使用 cout << f << endl 这样的形式。

最后再说一句,这不是题解。

2022/8/7 12:16
加载中...