浮点数后缀`f`的用法是什么


Answers:


73

3.00被解释为a double,与之相反,3.00f编译器将其视为a float

f后缀只是告诉编译器这是一个float和这是一个double

参见MSDN(C ++)


1
因此在OP的示例中,这两个语句是等效的,因为double会自动被截断为float?
林肯·伯根森

6
@LincolnBergeson:在OP情况下,是的。但是,如果您有一个方程式float price = 7.50 / 2.50;float price = 7.50f / 2.50f;则结果可能会因分辨率不同而有所不同。在第一种情况下,编译器将必须进行计算,double然后将结果转换为float。在第二种情况下,计算在中进行float。请注意,如果double整个值只有一个,则将计算为double。不允许C编译器对其进行优化,因为它们的舍入会有所不同。因此,floatvarA = floatvarB / 2.0执行效果比差2.0f
Martin Scharrer '17

35

除了已经说过的话,跟踪1.0和1.0f比许多人意识到的更为重要。如果您编写这样的代码:

然后x将被提升为double,因为2.0是double。不允许编译器优化该升级,否则将违反C标准。计算以双精度进行,然后将结果隐式截断为float。这意味着计算将比编写2.0f或2时要慢(尽管更准确)。

如果您编写了2,则该常数将为int类型,将被提升为浮点数,并且计算将使用“浮点精度”进行。一个好的编译器会警告您有关此升级的信息。

在此处阅读有关“常规算术转换”规则的更多信息:

http://msdn.microsoft.com/zh-CN/library/3t4w2bkb%28v=vs.80%29.aspx


3
实际上,值得您信赖的编译器将为您的示例生成单精度乘法float y = x * 2.0;。实际上,值得付出代价的编译器将为生成单精度乘法float y = x * (double)0.1f;,这是一项令人印象深刻的壮举(但仍然是正确的优化)。
Pascal Cuoq

@PascalCuoq:这样的编译器会违反C标准。您通过使用和明确地告诉它进行double乘法。不允许编译器使用会改变数值结果的优化。2.02.0f
Martin Scharrer '17

1
@MartinScharrer不会改变数字结果(相信我,我有浮点金牌)。我还可以指出Clang应用了这种优化,但是Clang'c浮点有很多非标准的东西,因此无法证明任何事情。
Pascal Cuoq

2
@MartinScharrer非引人注目的参考由Figueroa编写,标题中包含“ double rounding innocuous”一词,但我现在无法在不属于付费专区的版本中找到它。它显示,(float)((double)float_x * (double)float_y) == float_x * float_y编译器将逆向应用于此优化的相等性。之所以可行,是因为2double和的近似float是相同的。
Pascal Cuoq'4

16

因为不带后缀的浮点文字是双精度的,所以舍入意味着即使四舍五入的小数文字也可以取不同的值。在以下示例中可以看到:

这将输出no,因为0.67在四舍五入为float时与在四舍五入为double时具有不同的值。另一方面:

输出yes

可以使用大写或小写字母指定后缀。

也尝试一下:

检查@ codepade


将浮点数与==进行比较是一种不好的做法。原因是从十进制转换为二进制时累积的错误。当您开始处理浮点数时,这些错误会累积,从而无法进行精确比较。因此,您永远都不应期望浮点数等于精确值。
Ignas2526

@ Ignas2526然后,如果我有一段时间需要比较浮点数,您会提出什么建议。您能给我一些指导吗,从中进一步阅读。
Grijesh Chauhan 2015年


@ Ignas2526谢谢,我会读的,如果我在回答中发现要添加的内容,则会对其进行更新。您的链接也会对其他人有所帮助。
Grijesh Chauhan 2015年


0

这是因为浮点数字文字的默认类型-字符3.00是double而不是float。要进行此编译,您必须添加后缀f(或F)。


0

在float和double数据类型之间添加比较的更多组合。

输出:


-1

通常,差异并不重要,因为编译器无论如何都会将double常量转换为float。但是,请考虑以下事项:


1
您的答案虽然不能清楚地解释3.00和3.00f之间的区别……
James

1
确实...您可能正在添加一些信息,但您没有回答问题...
James

1
如果您尝试将double常量存储到float中,那么可以,您将隐式地从double转换为float。但是当涉及表达式时,编译器不能在不违反C / C ++标准的情况下将双常量转换为float。如果双精度常量与浮点数位于同一表达式中,则C / C ++的“常规算术转换”规则要求将浮点数隐式提升为双精度数。
伦丁

4
另外,当OP用C编写时,为什么还要用C ++答复?您的示例与C无关,因为C与C ++没有相同的严格类型检查。
伦丁
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.