在 C 中打印分配的值和计算值时,浮点值会有所不同

  • 本文关键字:有所不同 计算 打印 分配 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

我可以看到,在以第六个精度打印分配的值和计算值时,结果是不同的。为什么会这样?

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

0.3176470696926116943359375000000000000000000000000000000000000000000000
0.3176470696926116943359375000000000000000000000000000000000000000000000
0.3176470588235293934786795944091863930225372314453125000000000000000000

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

前两个是浮点数,而最后一个是双精度。双精度浮点数高 2 倍。

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

双精度

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

相关内容

最新更新