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,而您可以看到值没有正确存储DBL_MAX
和FLT_MAX
比我给出的输入要大得多。那么为什么它不能正确地存储输入呢scanf
为什么仍然说扫描结果为1DBL_MAX
和FLT_MAX
比我给出的输入要大得多。那么为什么它不能正确地存储输入呢scanf
为什么仍然说扫描结果为1DBL_MAX
和FLT_MAX
比我给出的输入要大得多。那么为什么它不能正确地存储输入呢scanf
为什么仍然说扫描结果为1scanf()
非负返回值的含义
此外,我没有发现值存储不正确。您提供的数字序列被解释为十进制数,大于浮点
可以表示的最大值。scanf()
函数将此类输入转换为float
,作为表示系统可以表示的最大float
值的数字;在您的实现中,这是一个float
正无穷大
double
的格式。该格式提供15-16位小数精度。当某些输入转换为双精度
(即使使用了不同的表示法)时,您无法避免舍入,因为数字格式无法将输入表示为其原始精度。通过scanf()
读取输入而不进行舍入的唯一方法是将其作为字符串而不是数字读取
DBL_MAX
和FLT_MAX
比我给出的输入要大得多。那么为什么它不能正确地存储输入呢FLT_MAX
,但您尝试将其作为浮点
读取。如果您认为输入在目标数字格式的范围内,那么您就错了
scanf
为什么仍然说扫描结果为1scanf()
非负返回值的含义
此外,我没有发现值存储不正确。您提供的数字序列被解释为十进制数,大于浮点
可以表示的最大值。scanf()
函数将此类输入转换为float
,作为表示系统可以表示的最大float
值的数字