浮点值“f”的后缀?
我想知道在C中的这两个variables之间有什么区别:
float price = 3.00;
和
float price = 3.00f;
尾随的“f”?
3.00
被解释为double
3.00f
,与3.00f
相反,编译器将其视为float
。
f
后缀只是告诉编译器哪个是float
,哪个是double
float
。
参见MSDN(C ++)
除了已经说过的话,跟踪1.0和1.0f比许多人意识到更重要。 如果你写这样的代码:
float x; ... float y = x * 2.0;
那么x会被提升为一倍,因为2.0是一个double。 编译器不允许优化该促销,否则将违反C标准。 计算以双精度进行,然后将结果隐式截断为浮点数。 这意味着,如果你写了2.0f或者2,计算速度会更慢(虽然更准确)。
如果你写了2,常数将是inttypes,这将被提升为一个浮点数,并且计算已经用“浮点精度”来完成。 一个好的编译器会警告你这个提升。
阅读更多关于“通常的算术转换”规则:
http://msdn.microsoft.com/en-us/library/3t4w2bkb%28v=vs.80%29.aspx
因为浮点文字是非双精度的,所以四舍五入就意味着即使是小文字也可以在四舍五入浮点和双精度时采用不同的值。 这可以在下面的例子中看到:
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
3.00是双重的,3.00f是浮动的。
通常,差异并不重要,因为编译器会将双常数转换为浮点数。 但是,请考虑这一点:
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
这是因为浮点数字文本的默认types – 字符3.00是双精度浮点数。 为了编译,你必须添加后缀f(或F)。
在float和double数据types之间增加几个比较组合。
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