0

为以下代码输入大数字会导致scanf成功,尽管该值未正确存储。

printf("\nDouble max: %f\n", DBL_MAX);
printf("\nFloat max: %f\n", FLT_MAX);
printf("\nPlease insert root1 data: ");
float input1;
scanResult = scanf("%f", &input1);
printf("\nScan Result is %d\n", scanResult);

double input2;
printf("\nPlease insert root2 data: ");
scanResult = scanf("%lf", &input2);
printf("\nScan Result is %d\n", scanResult);

printf("%f", input1);
printf("%f", input2);

输出:

Double max: 17976931348623157000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000
0.000000

Float max: 340282346638528860000000000000000000000.000000

Please insert root1 data: 1872389723948273985723984756982375698374568

Scan Result is 1

Please insert root2 data: 928734812348721834.2348275

Scan Result is 1


1.#INF00

928734812348721790.000000

所以我的问题是:

  1. 第一次扫描:为什么scanf扫描结果还是1,你可以看到值没有正确存储?

  2. 第二次扫描:为什么它会进行四舍五入,我该如何解决?

  3. 一般来说:通过 0 的数量,我们可以看到DBL_MAXFLT_MAX比我给出的输入要大得多。那么为什么它不能正确存储输入呢?

4

2 回答 2

3
  1. 第一次扫描:为什么scanf扫描结果还是1,你可以看到值没有正确存储?

扫描结果为 1,因为匹配、转换和分配了一个输入项。scanf()这就是非负时的返回值的含义。

此外,我没有看到该值存储不正确。您提供了一个数字序列,它被解释为十进制数,大于 afloat可以表示的最大值。该scanf()函数将这些输入转换float为代表系统可以表示的最大float“值”的数字;在您的实施中,这是一个float正无穷大。

  1. 第二次扫描:为什么它会进行四舍五入,我该如何解决?

浮点数具有固定大小的表示,就像所有 C 的内置数据类型一样。因此,它们的精度有一个限制,并且在它们的范围内有许多数字不能完全表示。这是浮点数和整数之间的权衡:前一种类型具有更广泛的范围和规模,但它们通常不精确。

您的机器很可能使用 IEEE-754 二进制双精度作为double. 该格式提供 15-16 位十进制数字的精度。double当某些输入转换为(即使使用不同的表示)时,您无法避免舍入,因为数字格式根本无法将输入表示为其原始精度。通过scanf()不四舍五入读取输入的唯一方法是将其读取为字符串而不是数字。

  1. 一般来说:通过 0 的数量,我们可以看到DBL_MAXFLT_MAX比我给出的输入要大得多。那么为什么它不能正确存储输入呢?

除了我已经讨论过的有限精度问题之外,请注意您的第一个输入大于FLT_MAX,但您尝试将其读取为float. 如果您认为输入在目标数字格式的范围内,那您就错了。

于 2017-03-07T14:21:43.790 回答
1
  1. 第一次扫描:为什么scanf扫描结果还是1,你可以看到值没有正确存储?

第一个数字大于FLT_MAX,因此被正确解析为无穷大。

  1. 第二次扫描:为什么它会进行四舍五入,我该如何解决?

第二个数字小于DBL_MAX,因此它为输入数字找到最佳的双精度浮点值。这就是显示的内容。如果你不明白这意味着什么,这篇文章会有所帮助

  1. 一般来说:通过 0 的数量,我们可以看到DBL_MAXFLT_MAX比我给出的输入要大得多。那么为什么它不能正确存储输入呢?

不正确。您将较大的数字解析为双精度数,将较小的数字解析为浮点数。

于 2017-03-07T14:10:59.797 回答