始终使用后缀'的任何优势;f';对于C+中的浮动+;? 在C++中使用后缀“F”的任何优势?

始终使用后缀'的任何优势;f';对于C+中的浮动+;? 在C++中使用后缀“F”的任何优势?,c++,C++,一方面,我的代码变得一团糟,我的意思是我有很多数学公式 想象一下,不是简单地写1,而是写1.0f。它会乱七八糟的 密码 但我想知道在这方面是否有优化或其他方面 谢谢1.0或1。是一个double常数 1.0f是一个float常量 有区别。1.0或1。是一个double常数 1.0f是一个float常量 这是有区别的。它可以消除警告 顺便说一句,根据编译器的不同,幕后浮动会升级为双倍进行计算。它可以消除警告 顺便说一句,根据编译器的不同,幕后浮点运算会升级为双倍运算。编译器几乎肯定会计算出来,因此

一方面,我的代码变得一团糟,我的意思是我有很多数学公式 想象一下,不是简单地写1,而是写1.0f。它会乱七八糟的 密码

但我想知道在这方面是否有优化或其他方面


谢谢

1.0
1。
是一个
double
常数

1.0f
是一个
float
常量


有区别。

1.0
1。
是一个
double
常数

1.0f
是一个
float
常量


这是有区别的。

它可以消除警告


顺便说一句,根据编译器的不同,幕后浮动会升级为双倍进行计算。

它可以消除警告


顺便说一句,根据编译器的不同,幕后浮点运算会升级为双倍运算。

编译器几乎肯定会计算出来,因此不会对运行时性能造成影响

显式的原因是为了避免编译器对隐式转换发出警告,避免可能发生意外行为的转换,以及在类型推断上下文中推导特定类型或强制调用特定重载

下面是一个示例,其中源希望将值表示为分数,但由于文本的类型错误,因此获取了错误的值:

float a = 3/4; // produces 0.0f instead of 0.75f
以下是由隐式转换引起的警告:

tmp.cpp:4:15: warning: implicit conversion loses floating-point precision:
      'double' to 'float' [-Wconversion]
    float a = 0.1;
          ~   ^~~
下面是一个由于不具体而导致的不明确重载错误的例子:

tmp.cpp:6:5: error: call to 'foo' is ambiguous
    foo(1);
    ^~~
tmp.cpp:2:6: note: candidate function
void foo(unsigned char a);
     ^
tmp.cpp:3:6: note: candidate function
void foo(float b);
     ^

编译器几乎可以肯定地计算出来,这样就不会对运行时性能造成影响

显式的原因是为了避免编译器对隐式转换发出警告,避免可能发生意外行为的转换,以及在类型推断上下文中推导特定类型或强制调用特定重载

下面是一个示例,其中源希望将值表示为分数,但由于文本的类型错误,因此获取了错误的值:

float a = 3/4; // produces 0.0f instead of 0.75f
以下是由隐式转换引起的警告:

tmp.cpp:4:15: warning: implicit conversion loses floating-point precision:
      'double' to 'float' [-Wconversion]
    float a = 0.1;
          ~   ^~~
下面是一个由于不具体而导致的不明确重载错误的例子:

tmp.cpp:6:5: error: call to 'foo' is ambiguous
    foo(1);
    ^~~
tmp.cpp:2:6: note: candidate function
void foo(unsigned char a);
     ^
tmp.cpp:3:6: note: candidate function
void foo(float b);
     ^
有时这是必要的

考虑以下函数模板:

template<typename T>
void f(T a, T b);

float get_value(); //consider this too!
在前两个调用中,模板参数推断失败,因此无法编译。您自己也可以看到错误

请注意,
1
的类型是
int
1.0
double
,而
1.0f
float
,有时这是必要的

考虑以下函数模板:

template<typename T>
void f(T a, T b);

float get_value(); //consider this too!
在前两个调用中,模板参数推断失败,因此无法编译。您自己也可以看到错误


请注意,
1
的类型是
int
1.0
的类型是
double
,而
1.0f
的类型是
float
指定double vs.float的另一种用法是FORTRAN遗留下来的,可能会也可能不会困扰编译器。在过去的日子里,FORTRAN只按您指定的精度存储数据,在最后一位数字之外的未指定字节中留下垃圾。根据“x”的类型(在FORTRAN中是一个单精度浮点数),很有可能编码x=1.0并使x真正等于1.0987659987623。

指定双精度与浮点的另一个用途是FORTRAN留下的,可能会也可能不会困扰编译器。在过去的日子里,FORTRAN只按您指定的精度存储数据,在最后一位数字之外的未指定字节中留下垃圾。根据“x”的类型(在FORTRAN中是一个单精度浮点数),很有可能编码x=1.0并使x真正等于1.0987659987623。

1是int,1.0是double,1.0f是浮点。
1.f
甚至是
1。
使其成为浮点计算的
double
,而不是整数运算。
1.0f
将是浮点,
1.0
将是double。据我所知,没有什么优势。1是int,1.0是double,1.0f是float。
1.f
甚至只是
1。
使它成为浮点计算的
double
,而不是整数算术。
1.0f
将是float,
1.0
将是double。据我所知,没有任何优势。或者两者都可能升级为更大的类型。或者两者都可能升级为更大的类型。亲爱的朋友们,这本是介绍std::identity模板的绝佳机会,但在C++0x期间删除了该模板,但会很好地解决此类和类似情况。这真是太遗憾了……亲爱的朋友们,这本来是一个介绍std::identity模板的绝佳机会,但是在C++0x期间,它被删除了,但是它很好地解决了类似的情况。真遗憾。。。