2

在我正在阅读的 OGRE3d 教程中程序员不断f在他初始化的任何变量的末尾添加,就像我决定擦除并查看它200.00f是否编译并且编译得很好,添加的意义何在变量的结尾?0.00fff

编辑:所以你是说,如果我用它初始化一个变量,200.03它不会将它初始化为一个浮点数,但如果我用200.03f它来做呢?如果不是,那么 f 在哪里变得有用呢?

4

5 回答 5

6

这是一种指定必须将数字解释为“浮点数”而不是“双精度数”的方法(这是 C++ 十进制数的标准,占用了两倍的内存)。

这个讨论可能会有所帮助:

http://www.cplusplus.com/forum/beginner/24483/

于 2013-03-18T17:07:49.713 回答
3

引自http://msdn.microsoft.com/en-us/library/w9bk1wcy.aspx

没有 f、F、l 或 L 后缀的浮点常量具有 double 类型。如果字母 f 或 F 是后缀,则常量的类型为 float。如果以字母 l 或 L 为后缀,则它的类型为 long double。例如:

于 2013-03-18T17:06:19.943 回答
3

200.00f不是变量。它不能变化

它是一个编译时常量,具有float表示形式。f表示它是一个float.

相比之下,200.00将被解释为double.

于 2013-03-18T17:06:45.657 回答
2

C 标准规定常量浮点数是双精度数,这将操作提升为双精度数。

float a,b,c;
...
a = b+7.1;  this is a double precision operation
...
a = b+7.1f;  this is a single precision operation
...
c = 7.1; //double
a = b + c; //single all the way

双精度需要更多的常量存储空间,加上变量操作数从单精度到双精度的转换,然后从双精度到单精度的转换以分配结果。如果您不了解浮点的工作方式、舍入等,那么所有的转换都在进行,您可能不会得到您认为会得到的结果。编译器可能会在路径中的某个点优化其中的一些行为,使其更难理解真正的问题,并且硬件中的 fpu 可能接受混合模式操作数,也隐藏了真正发生的事情。

这不仅是速度问题,而且是准确性问题。最近有一个 SO question,几乎是同样的问题,为什么这种比较只适用于一个数字而不是另一个数字。以分数 5/11 为例 0.454545....

float a = 0.45454545454;
...
if(a>0.4545454545) b=1;
...

在我们假设的系统中,我们只能将三个数字存储到 a 中,所以 a = .455 因为我们默认使用向上舍入模式。但是我们的比较将被认为是双重的,因为我们没有把 f 放在数字的末尾。双版本是 0.454545。a 转换为双精度值,结果为 0.455000,因此:

if(0.455000>0.454545) b = 1;

0.455 大于 0.454545,所以 b 为 1。

float a = 0.45454545454;
...
if(a>0.4545454545f) b=1;
...

所以现在比较是单精度的,所以我们将 0.455 与 0.455 进行比较,后者并不更大,所以 b=1 不会发生。

当您编写以十进制为底的浮点常量时,计算机中的浮点数以 2 为底,并且它们并不总是像 5/11 那样在以 11 为底的情况下工作得很好,但在以 10 为底的情况下,您会得到一个无限重复的数字. 例如,十进制的 0.1 会创建二进制的重复模式。根据尾数截断的位置,舍入可以使尾数的 lsbit 向上舍入(如果您使用的浮点格式甚至有舍入,也取决于您使用的舍入模式)。哪一个本身会产生问题,具体取决于您如何使用变量,如上面的比较所示。

对于非浮点数,编译器通常会为您节省,但有时不会:

unsigned long long a;
...
a = ~3;
a = ~(3ULL);
...

根据编译器和计算机的不同,这两个赋值可能会给你不同的结果,一个可能会给你 0x00000000FFFFFFFC,另一个可能会给你 0xFFFFFFFFFFFFFFFC。

如果你想要一些特定的东西,当你告诉编译器你想要什么时你应该很清楚,否则编译器会猜测并且并不总是做出你想要的猜测。

于 2013-03-18T17:27:22.057 回答
1

这意味着该值将被解释为单精度浮点变量(类型float)。没有 f 后缀,它被解释为双精度浮点变量(类型double)。

这通常是为了通过将双精度值分配给浮点变量来关闭编译器关于可能丢失精度的警告。当您没有收到这样的警告时,您可能已经在编译器设置中关闭了警告(这很糟糕!)。

但它也可以具有微妙的句法意义。如您所知,C++ 允许具有相同名称但参数类型不同的函数。在这种情况下,f 后缀可以确定调用哪个函数。

于 2013-03-18T17:06:14.610 回答