浮点值后缀`f`有什么用

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

我想知道 C: 中这两个变量有什么区别

float price = 3.00;

float price = 3.00f;

在这种情况下后缀

f
有什么用?

c floating-point literals
7个回答
89
投票

3.00
被解释为
double
,而不是
3.00f
,后者被编译器视为
float

f
后缀只是告诉编译器哪个是
float
,哪个是
double

参见 MSDN (C++)


37
投票

除了已经说过的内容之外,跟踪 1.0 与 1.0f 比许多人意识到的更重要。如果你写这样的代码:

float x;
...
float y = x * 2.0;

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

如果你写成2,常量将是int类型,它会被提升为float,并且计算将以“float精度”完成。一个好的编译器会警告您有关此促销的信息。

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

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


23
投票

因为无后缀的浮点文字是双精度数,而舍入意味着即使很小的文字在舍入为浮点数和双精度数时也可以采用不同的值。这可以在以下示例中观察到:

float f=0.67;
if(f == 0.67) 
  printf("yes");
else 
  printf("no");  

这将输出

no
,因为
0.67
在四舍五入为浮点数时与四舍五入为双倍时具有不同的值。另一方面:

float f=0.67;
if(f == 0.67f) 
  printf("yes");
else 
  printf("no"); 

输出

yes

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

也试试这个:

printf(" %u %u\n", sizeof(.67f), sizeof(.67));

检查@codepade


6
投票

3.00 是双精度型,3.00f 是浮点数。


1
投票

添加了一些 float 和 double 数据类型之间的比较组合。

int main()
{
    // Double type constant(3.14) converts to Float type by 
    // truncating it's bits representation 
    float a = 3.14; 
    // Problem: float type 'a' promotes to double type and the value 
    // of 'a'  depends on how many bits added to represent it.
    if(a == 3.14)   
        std::cout<<"a: Equal"<<std::endl;
    else
        std::cout<<"a: Not Equal"<<std::endl; 

    float b = 3.14f; // No type conversion
    if(b == 3.14)    // Problem: Float to Double conversion
        std::cout<<"b: Equal"<<std::endl;
    else
        std::cout<<"b: Not Equal"<<std::endl;

    float c = 3.14; // Double to Float conversion (OK even though is not a good practice )
    if(c == 3.14f)  // No type conversion 
        std::cout<<"c: Equal"<<std::endl;  // OK
    else
        std::cout<<"c: Not Equal"<<std::endl;

    float d = 3.14f;
    if(d == 3.14f)
        std::cout<<"d: Equal"<<std::endl; // OK
    else
        std::cout<<"d: Not Equal"<<std::endl;

    return 0;
}    

输出:

 a: Not Equal
 b: Not Equal
 c: Equal
 d: Equal

0
投票

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


-1
投票

通常差异并不重要,因为编译器无论如何都会将双精度常量转换为浮点数。但是,请考虑一下:

template<class T> T min(T a, T b)
{
  return (a < b) ? a : b;
}

float x = min(3.0f, 2.0f); // will compile
x = min(3.0f, 2);   // compiler cannot deduce T type
x = min(3.0f, 2.0); // compiler cannot deduce T type
© www.soinside.com 2019 - 2024. All rights reserved.