C 从文字浮点数赋值

lee*_*man 4 c floating-point assign

在阅读一本关于 3D 图形书的一部分时,我遇到了以下作业:

const float vertexPositions[] = {
0.75f, 0.75f, 0.0f, 1.0f,
0.75f, -0.75f, 0.0f, 1.0f,
-0.75f, -0.75f, 0.0f, 1.0f,
};
Run Code Online (Sandbox Code Playgroud)

为什么需要 f 后缀?不能从变量的类型确定文字的类型吗?我相信没有 f 浮点文字被解释为双打,但为什么当数组显然是 float 类型时?

Pas*_*uoq 5

您示例中的浮点数组初始化在 C 中很好,就像它使用double常量一样。对于手头的值,如果它是一个doublefloat常量初始化的数组也很好,因为手头的值可以完全表示为float。即使在最后一种情况下,编译器也没有理由发出警告,尽管开发人员费心输入与最终类型不匹配的附加后缀会很奇怪和令人困惑。

简而言之,作者只是明确的,这在float数组的情况下是好的。

对于十进制写的任意值,由于“双舍入”(其中“double”一词表示两次,而不是指同名类型),因此您不想floatdouble常量初始化变量。如果你初始化和如下,他们结了不同的值,实际上是最接近预期值1.01161128282547:f1f2f1

  float f1 = 1.01161128282547f;
  float f2 = 1.01161128282547;
Run Code Online (Sandbox Code Playgroud)

解释是,在 的情况下f2,十进制值 1.01161128282547先四舍五入到最接近的值double,然后再四舍五入到最接近的float。这两个步骤比直接舍入到最近的 引入了更多的错误float,这f1就是初始化的方式。