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