在进行除法操作时,我可以看到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;
}
结果:
0.317647069693----->0.317647069693 -----> 0.317647058824
我可以看到在以第六精度打印指定值和计算值时结果不同。为什么会这样?
答案 0 :(得分:7)
前两个值是单精度浮点值,最后一个是双精度值。如果您使用更多小数打印它们,您将看到差异,例如:
0.3176470696926116943359375000000000000000000000000000000000000000000000
0.3176470696926116943359375000000000000000000000000000000000000000000000
0.3176470588235293934786795944091863930225372314453125000000000000000000
请记住,C中的标准浮点类型是double,而不是float。浮点常量(例如255.
)的类型为double,而不是float。因此printf的最后一个参数a/255.
将使用双精度计算,并作为double发送到printf。变量value_1
和value_2
的类型为float,即使它们在发送到printf时转换为double,它们的二进制数字也会减少。
答案 1 :(得分:0)
前两个是浮动,而最后一个是双。 double 的精度比 float 高2倍。
单精度(浮点数)为您提供23位有效数字,8位指数和1位符号位。
双精度(double)为您提供52位有效数,11位指数和1位符号。