浮点数溢出但不是在C中的printf参数?

Jon*_*ner 0 c floating-point printf arguments overflow

为什么当我的溢出计算是printf()函数的参数时,float不会溢出,但是当编码计算被分配给一个单独的变量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?
Run Code Online (Sandbox Code Playgroud)

结果:

This demonstrates floating data type overflow. We should  get an 'inf' value.
3.400000e+38*10=3.400000e+39.
Run Code Online (Sandbox Code Playgroud)

而且,当计算不是一个论点时:

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
Run Code Online (Sandbox Code Playgroud)

及其结果:

This demonstrates floating data type overflow. We should  get an 'inf' value.
3.400000e+38*10=inf.
Run Code Online (Sandbox Code Playgroud)

Jen*_*edt 6

实际上编译器不限制进行算术运算,float但它可能使用double.5.2.4.2.1当前的C标准有:

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

所以你只知道float在分配它时强制赋值.因为在printf调用的上下文中(它是一个va_arg函数)double无论如何都需要任何这样的参数,所以在FLT_EVAL_METHOD有价值的情况下不会发生转换1,即所有float算术都在其中完成double.