0

为什么当我的溢出计算是 printf() 函数的参数时,浮点数不会溢出,但是当编码计算分配给单独的变量时,float_overflowed,而不是 printf 函数的参数我得到“inf”的预期结果?为什么会这样?是什么导致了这种差异?

导致我提出这个问题的代码和结果如下。

这是我的代码在计算是参数时没有按预期执行:

float float_overflow;
float_overflow=3.4e38;
printf("This demonstrates floating data type overflow. We should  get an \'inf\' value.\n%e*10=%e.\n\n",float_overflow, float_overflow*10);     //No overflow?

结果:

This demonstrates floating data type overflow. We should  get an 'inf' value.
3.400000e+38*10=3.400000e+39.

并且,当计算不是参数时:

float float_upperlimit;
float float_overflowed;
float_upperlimit=3.4e38;
float_overflowed=float_upperlimit*10;
printf("This demonstrates floating data type overflow. We should  get an \'inf\' value.\n%e*10=%e.\n\n",float_upperlimit, float_overflowed);        //for float overflow

及其结果:

This demonstrates floating data type overflow. We should  get an 'inf' value.
3.400000e+38*10=inf.
4

2 回答 2

6

实际上,编译器并不受限于进行算术运算,float但它很可能使用双精度。当前 C 标准的 5.2.4.2.1 有:

除了赋值和强制转换(删除所有额外的范围和精度)之外,具有浮动操作数的运算符产生的值和经过通常算术转换的值和浮动常量的值被评估为范围和精度可能大于所需的格式方式。评估格式的使用以 FLT_EVAL_METHOD 的实现定义值为特征

float所以你只知道在分配它时强制该值。由于在printf调用的上下文中(它是一个 va_arg 函数),无论如何都需要任何这样的参数,所以在valuedouble的情况下不会发生转换,即所有算术都是在 中完成的。FLT_EVAL_METHOD1floatdouble

于 2013-10-04T08:39:35.747 回答
1

请记住,对于"%e"格式(以及所有其他浮点格式代码),参数实际上是一个double. 参见本参考资料中的表格。

这意味着当您将“内联”作为参数进行计算时,您现在实际上会溢出。但是,当您为变量执行此操作时,它确实会溢出,并且在printf调用中使用时会携带。

于 2013-10-04T08:28:38.083 回答