scanf成功,但存储的值不适合某些大浮点数

scanf成功,但存储的值不适合某些大浮点数,c,floating-point,double,scanf,numeric-limits,C,Floating Point,Double,Scanf,Numeric Limits,为下面的代码输入大量数字会导致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);

为下面的代码输入大量数字会导致
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);
输出:

双最大值:1797693134862315700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0
最大浮动:3402823466385286000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
请插入root1数据:18723897239484273985723984756982375698374568
扫描结果为1
请插入root2数据:928734812348721834.2348275
扫描结果为1
1.#INF00
928734812348721790.000000
因此,我的问题是:

  • 第一次扫描:为什么
    scanf
    仍然说扫描结果是1,而您可以看到值没有正确存储

  • 第二次扫描:它为什么会这样做,我如何修复它

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

  • 第一次扫描:当您看到值未正确存储时,
    scanf
    为什么仍然说扫描结果为1
  • 第一个数字大于FLT_MAX,因此正确解析为无穷大

  • 第二次扫描:它为什么会这样做,我如何修复 是吗
  • 第二个数字小于DBL_MAX,因此它会为输入数字找到最佳的双精度浮点值。这就是显示的内容。如果你不明白这意味着什么

  • 一般来说:通过0的数量,我们可以看到
    DBL_MAX
    FLT_MAX
    比我给出的输入要大得多。那么为什么它不能正确地存储输入呢
  • 不对。您正在将较大的数字解析为double,将较小的数字解析为float

  • 第一次扫描:当您看到值未正确存储时,
    scanf
    为什么仍然说扫描结果为1
  • 第一个数字大于FLT_MAX,因此正确解析为无穷大

  • 第二次扫描:它为什么会这样做,我如何修复 是吗
  • 第二个数字小于DBL_MAX,因此它会为输入数字找到最佳的双精度浮点值。这就是显示的内容。如果你不明白这意味着什么

  • 一般来说:通过0的数量,我们可以看到
    DBL_MAX
    FLT_MAX
    比我给出的输入要大得多。那么为什么它不能正确地存储输入呢
  • 不对。您正在将较大的数字解析为double,将较小的数字解析为float

  • 第一次扫描:当您看到值未正确存储时,
    scanf
    为什么仍然说扫描结果为1
  • 扫描结果为1,因为匹配、转换和分配了一个输入项。这就是
    scanf()
    非负返回值的含义

    此外,我没有发现值存储不正确。您提供的数字序列被解释为十进制数,大于
    浮点
    可以表示的最大值。
    scanf()
    函数将此类输入转换为
    float
    ,作为表示系统可以表示的最大
    float
    值的数字;在您的实现中,这是一个
    float
    正无穷大

  • 第二次扫描:它为什么会这样做,我如何修复它
  • 浮点数具有固定大小的表示形式,所有C的内置数据类型也是如此。因此,它们的精度是有限的,在它们的范围内有许多数字不能精确表示。这是浮点和整数之间的折衷:前一种类型的范围和规模更广,但它们通常不精确

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

  • 一般来说:通过0的数量,我们可以看到
    DBL_MAX
    FLT_MAX
    比我给出的输入要大得多。那么为什么它不能正确地存储输入呢
  • 除了我已经讨论过的有限精度问题外,请注意,您的第一个输入大于
    FLT_MAX
    ,但您尝试将其作为
    浮点
    读取。如果您认为输入在目标数字格式的范围内,那么您就错了

  • 第一次扫描:当您看到值未正确存储时,
    scanf
    为什么仍然说扫描结果为1
  • 扫描结果为1,因为匹配、转换和分配了一个输入项。这就是
    scanf()
    非负返回值的含义

    此外,我没有发现值存储不正确。您提供的数字序列被解释为十进制数,大于
    浮点
    可以表示的最大值。
    scanf()
    函数将此类输入转换为
    float
    ,作为表示系统可以表示的最大
    float
    值的数字