C 什么';在浮点值上使用后缀'f'

C 什么';在浮点值上使用后缀'f',c,floating-point,C,Floating Point,我想知道这两个变量在C中的区别是什么: float price = 3.00; 及 在这种情况下,后缀f有什么用?3.00是双精度的,3.00f是浮点。3.00被解释为双精度的,而编译器认为3.00f是浮点型的 f后缀只是告诉编译器哪个是float,哪个是double 请参见这是因为 浮点数字文字- 字符3.00是双精度而不是浮点型。 要进行编译,您必须添加 后缀f(或f)。通常差异并不重要,因为编译器无论如何都会将双常量转换为浮点。但是,考虑一下: template<class T&g

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

float price = 3.00;


在这种情况下,后缀
f
有什么用?

3.00是双精度的,3.00f是浮点。

3.00
被解释为
双精度的
,而编译器认为
3.00f
是浮点型的

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


请参见

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

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

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
模板T最小值(T a,T b)
{
返回(a
除了已经说过的,跟踪1.0和1.0f比许多人意识到的更重要。如果您编写这样的代码:

float x;
...
float y = x * 2.0;
然后x将升级为double,因为2.0是double。编译器不允许优化升级,否则将违反C标准。计算以双精度进行,然后将结果隐式截断为浮点。这意味着,与编写2.0f或2时相比,计算速度会慢一些(尽管更精确)

如果您编写了2,常量将是int类型,它将被提升为float,并且计算将以“float precision”完成。一个好的编译器会警告你这次升级

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


因为无固定浮点文本是双精度的,舍入意味着即使是小的文本在舍入为浮点和双精度时也可能具有不同的值。这可以在以下示例中观察到:

float f=0.67;
if(f == 0.67) 
  printf("yes");
else 
  printf("no");  
这将输出
no
,因为
0.67
四舍五入到float时的值与四舍五入到double时的值不同。另一方面:

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

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

也可以尝试以下方法:

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

选中@

在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;
}    

你的答案并没有清楚地解释3.00和3.00f之间的区别,但是…确切地说。。。您可能正在添加一些信息,但没有回答问题……如果您尝试将双精度常量存储到浮点中,那么是的,您将得到从双精度到浮点的隐式降级。但对于表达式,编译器无法在不违反C/C++标准的情况下将双常量转换为浮点。如果双常数与浮点的表达式相同,那么C/C++的“普通算术转换”规则要求浮点隐式提升为双元,而且,当OP在C中写入时,为什么用C++回答?你的例子在C中是不相关的,因为C没有和C++一样的严格类型检查。很多重复,例如我可以推荐它作为进一步的阅读。实际上,一个有价值的编译器会为你的例子生成一个单精度乘法:代码>浮点y= x * 2;<代码>。事实上,一个称职的编译器将为
float y=x*(double)0.1f生成一个单精度乘法
,一个更令人印象深刻的壮举(但仍然是一个正确的优化)。@PascalCuoq:这样的编译器将违反C标准。您明确告诉它使用
2.0
而不是
2.0f
进行
double
乘法。编译器不允许使用会改变数值结果的优化。@Martinsharre它不会改变数值结果(相信我,我有浮点金徽章)。我还可以指出,Clang应用了这种优化,但是关于Clang'c浮点的内容太多了,这是非标准的,这不能证明任何事情。@Martinsharre非权威引用由Figueroa编写,其中包含“双舍入无害”这几个字在标题,但我找不到一个版本,不是背后的付费墙现在。它显示了
(float)((double)float\ux*(double)float\uy)=float\ux*float\uy
,编译器在这个优化中反向应用了一个等式。这是因为2作为
double
float
的近似值是相同的。将浮点数与==进行比较是一种不好的做法。原因是将十进制转换为二进制时累积的错误。当您开始操作浮点数时,这些错误会累积,从而无法进行精确的比较。出于这个原因,您永远不应该期望浮点数等于某个精确的值。@Ignas2526那么,如果我需要比较浮点数,您会提出什么建议。你能给我一些进一步阅读的建议吗?这里有几页讨论了我在这里提到的问题:@Ignas2526谢谢,我会读的,如果我在我的答案中发现了一些东西,我会更新它。你的链接对其他人也会有帮助。所以在OP的例子中,这两条语句是等价的,因为double会自动被截断成一个float?@LincolnBergeson:在OP的例子中,是的。然而,如果你有一个等式
浮动价格=7.50/2.50对<代码>浮动价格=7.50f/2.50f则结果可能因分辨率不同而不同。在第一种情况下,编译器必须以
double
的方式进行计算,然后将结果转换为
float
。在第二种情况下,在
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