我在一个程序中看到
1/3.f
,想知道.f
是做什么用的。所以尝试了我自己的程序:
#include <iostream>
int main()
{
std::cout << (float) 1/3 << std::endl;
std::cout << 1/3.f << std::endl;
std::cout << 1/3 << std::endl;
}
.f
是否像石膏一样使用?有没有地方可以让我了解更多有关这种有趣语法的信息?
3.
相当于 3.0
,是双精度。
f
跟随数字文字使其成为浮点数。
如果没有
.f
,数字将被解释为整数,因此 1/3
是 (int)1/(int)3
=> (int)0
,而不是所需的 (float)0.333333
。 .f
告诉编译器将文字解释为 float 类型的浮点数。还有其他这样的结构,例如 0UL
表示 (unsigned long)0
,而普通的 0
将是 (int)0
。
.f
实际上是两个组件,.
表示文字是浮点数而不是整数,f
后缀告诉编译器文字应该是float类型而不是默认类型用于浮点文字的双精度类型。
免责声明;上面解释中使用的“强制转换构造”并不是实际的强制转换,而只是指示文字类型的一种方式。
如果您想了解有关文字以及可以在其中使用的后缀的所有信息,您可以阅读 C++ 标准,(1997 草案、C++11 草案、C++14 草案、C+ +17 草案、C++20 草案、C++23 草案)或者,看看一本不错的教科书,例如 Stroustrup 的 C++ 编程语言。
顺便说一句,在您的示例中
(float)1/3
文字 1
和 3
实际上是整数,但是 1 首先被您的转换转换为浮点数,然后 3 被隐式转换为浮点数,因为它是浮点运算符的右侧操作数。 (该运算符是浮点型,因为它的左侧操作数是浮点型。)
默认情况下,
3.2
被视为double
;因此,要强制编译器将其视为float
,您需要在末尾编写f
。
看看这个有趣的演示:
float a = 3.2;
if ( a == 3.2 )
cout << "a is equal to 3.2"<<endl;
else
cout << "a is not equal to 3.2"<<endl;
float b = 3.2f;
if ( b == 3.2f )
cout << "b is equal to 3.2f"<<endl;
else
cout << "b is not equal to 3.2f"<<endl;
输出:
a 不等于 3.2
b 等于 3.2f
在 ideone 进行实验:http://www.ideone.com/WS1az
尝试将变量
a
的类型从float
更改为double
,再次查看结果!
3.f 是 3.0f 的缩写 - 数字 3.0 作为 float 类型的浮点文字。
小数点和 f 有不同的用途,所以它不是真正的 .f
您必须了解,在 C 和 C++ 中,一切都是类型化的,包括文字。
3 是一个字面整数。 3. 是字面上的双精度数 3.f 是字面上的浮点数。
IEEE 浮点型的精度低于双精度型。 float 仅使用 32 位,带有 23 位尾数和 8 位指数(加上符号位)。
double 为您提供更高的准确性,但有时您不需要这样的准确性(例如,如果您正在对一开始只是估计的数字进行计算)并且 float 给出的值就足够了,并且如果您要存储大量数据(例如处理大量时间序列数据)这可能比准确性更重要。
因此 float 仍然是一个有用的类型。
您不应将其与 printf 和等效语句使用的符号混淆。