在进行除法运算时,我可以看到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)
我可以看到在以第六精度打印指定值和计算值时结果不同.为什么会这样?
前两个值是单精度浮点值,最后一个值是双精度值.如果您使用更多小数打印它们,您将看到差异,例如:
0.3176470696926116943359375000000000000000000000000000000000000000000000
0.3176470696926116943359375000000000000000000000000000000000000000000000
0.3176470588235293934786795944091863930225372314453125000000000000000000
Run Code Online (Sandbox Code Playgroud)
请记住,C中的标准浮点类型是double,而不是float.浮点常量(如您的255.)具有double类型,而不是float类型.因此printf的最终参数a/255.将使用双精度计算,并作为double发送到printf.变量value_1和value_2类型为float,即使它们在发送到printf时转换为double,它们的二进制数字也较少.