数字后面附加“.f”的目的?

问题描述 投票:0回答:5

我在一个程序中看到

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
是否像石膏一样使用?有没有地方可以让我了解更多有关这种有趣语法的信息?

c++ syntax casting
5个回答
72
投票

3.
相当于
3.0
,是双精度。

f
跟随数字文字使其成为浮点数。


56
投票

如果没有

.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 被隐式转换为浮点数,因为它是浮点运算符的右侧操作数。 (该运算符是浮点型,因为它的左侧操作数是浮点型。)


23
投票

默认情况下,

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
,再次查看结果!


10
投票

3.f 是 3.0f 的缩写 - 数字 3.0 作为 float 类型的浮点文字。


3
投票

小数点和 f 有不同的用途,所以它不是真正的 .f

您必须了解,在 C 和 C++ 中,一切都是类型化的,包括文字。

3 是一个字面整数。 3. 是字面上的双精度数 3.f 是字面上的浮点数。

IEEE 浮点型的精度低于双精度型。 float 仅使用 32 位,带有 23 位尾数和 8 位指数(加上符号位)。

double 为您提供更高的准确性,但有时您不需要这样的准确性(例如,如果您正在对一开始只是估计的数字进行计算)并且 float 给出的值就足够了,并且如果您要存储大量数据(例如处理大量时间序列数据)这可能比准确性更重要。

因此 float 仍然是一个有用的类型。

您不应将其与 printf 和等效语句使用的符号混淆。

© www.soinside.com 2019 - 2024. All rights reserved.