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

时间:2018-04-10 14:25:22

标签: 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;
}

结果:

0.317647069693----->0.317647069693 -----> 0.317647058824

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

2 个答案:

答案 0 :(得分:7)

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

0.3176470696926116943359375000000000000000000000000000000000000000000000
0.3176470696926116943359375000000000000000000000000000000000000000000000
0.3176470588235293934786795944091863930225372314453125000000000000000000

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

答案 1 :(得分:0)

前两个是浮动,而最后一个是双。 double 的精度比 float 高2倍。

单精度(浮点数)为您提供23位有效数字,8位指数和1位符号位。

双精度(double)为您提供52位有效数,11位指数和1位符号。