在C中打印指定值和计算值时,浮点值不同

sub*_*bha 0 c

在进行除法运算时,我可以看到GCC编译器的一个问题.

码:

#include <stdio.h>
int main() {
   unsigned char a = 81;
   float value_1 = a / 255.; 
   float value_2 = (float)a / 255.0; 
   printf("%.12f----->%.12f -----> %.12f", value_1, value_2, a/255.);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

结果:

0.317647069693----->0.317647069693 -----> 0.317647058824
Run Code Online (Sandbox Code Playgroud)

我可以看到在以第六精度打印指定值和计算值时结果不同.为什么会这样?

Tho*_*thy 7

前两个值是单精度浮点值,最后一个值是双精度值.如果您使用更多小数打印它们,您将看到差异,例如:

0.3176470696926116943359375000000000000000000000000000000000000000000000
0.3176470696926116943359375000000000000000000000000000000000000000000000
0.3176470588235293934786795944091863930225372314453125000000000000000000
Run Code Online (Sandbox Code Playgroud)

请记住,C中的标准浮点类型是double,而不是float.浮点常量(如您的255.)具有double类型,而不是float类型.因此printf的最终参数a/255.将使用双精度计算,并作为double发送到printf.变量value_1value_2类型为float,即使它们在发送到printf时转换为double,它们的二进制数字也较少.