"f"在浮动值上的后缀?

Ale*_*lex 68 c floating-point

我想知道C中这两个变量之间的区别是什么:

float price = 3.00;
Run Code Online (Sandbox Code Playgroud)

float price = 3.00f;
Run Code Online (Sandbox Code Playgroud)

尾随"f"?

Jam*_*mes 69

3.00被解释为a double,而3.00f编译器则将其视为a float.

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

请参阅MSDN(C++)

  • @LincolnBergeson:在OP案例中是的.但是,如果你有一个方程式'浮动价格= 7.50/2.50;`对比`浮动价格= 7.50f/2.50f;`那么结果可能因分辨率不同而不同.在第一种情况下,编译器必须以"double"的形式进行计算,然后将结果转换为`float`.在第二种情况下,计算在`float`中完成.请注意,如果只有一个值为"double",则整个事物计算为"double".不允许C编译器优化它,因为它们的舍入会有所不同.因此`floatvarA = floatvarB/2.0`的表现比`2.0f`差. (6认同)

Lun*_*din 35

除了已经说过的内容之外,跟踪1.0和1.0f比许多人意识到的更重要.如果您编写如下代码:

float x;
...
float y = x * 2.0;
Run Code Online (Sandbox Code Playgroud)

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

假如你写2,定会是int类型,这将被提升到一个浮动,并且计算将被用"float精度"完成的.一个好的编译器会警告你这个促销.

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

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

  • 实际上,一个值得它的盐的编译器会为你的例子`float y = x*2.0;`生成一个单精度乘法.事实上,一个值得它的盐的编译器将为`float y = x*(double)0.1f;`生成一个单精度乘法,这是一个更令人印象深刻的壮举(但仍然是一个正确的优化). (3认同)
  • @MartinScharrer 不吸引权威的参考文献由 Figueroa 撰写,标题中包含“双重舍入无害”字样,但我现在无法在不属于付费专区的版本中找到它。它表明`(float)((double)float_x * (double)float_y) == float_x * float_y`,编译器反向应用此优化的等式。这是有效的,因为 2 作为 `double` 和 `float` 的近似值是相同的。 (2认同)

Gri*_*han 12

因为未填充的浮点文字是双精度的,并且舍入意味着即使是小文字在舍入为float和double时也可以采用不同的值.这可以在以下示例中观察到:

float f=0.67;
if(f == 0.67) 
  printf("yes");
else 
  printf("no");  
Run Code Online (Sandbox Code Playgroud)

这将输出no,因为0.67舍入为浮动时的值与舍入为double时的值不同.另一方面:

float f=0.67;
if(f == 0.67f) 
  printf("yes");
else 
  printf("no"); 
Run Code Online (Sandbox Code Playgroud)

输出yes.

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

试试这个:

printf(" %u %u\n", sizeof(.67f), sizeof(.67));
Run Code Online (Sandbox Code Playgroud)

检查@ codepade

  • 以下是几个页面,讨论了我在这里提到的问题:http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html http://www.cygnus-software.com/论文/comparingfloats/comparingfloats.htm (2认同)

Eri*_*rik 6

3.00是双,3.00f是浮点数.