我想知道C中这两个变量之间的区别是什么:
float price = 3.00;
和
float price = 3.00f;
f
在这种情况下,后缀有什么用?
我想知道C中这两个变量之间的区别是什么:
float price = 3.00;
和
float price = 3.00f;
f
在这种情况下,后缀有什么用?
Answers:
float price = 7.50 / 2.50;
,float price = 7.50f / 2.50f;
则结果可能会因分辨率不同而有所不同。在第一种情况下,编译器将必须进行计算,double
然后将结果转换为float
。在第二种情况下,计算在中进行float
。请注意,如果double
整个值只有一个,则将计算为double
。不允许C编译器对其进行优化,因为它们的舍入会有所不同。因此,floatvarA = floatvarB / 2.0
执行效果比差2.0f
。
除了已经说过的话,跟踪1.0和1.0f比许多人意识到的更为重要。如果您编写这样的代码:
float x;
...
float y = x * 2.0;
然后x将被提升为double,因为2.0是double。不允许编译器优化该升级,否则将违反C标准。计算以双精度进行,然后将结果隐式截断为float。这意味着计算将比编写2.0f或2时要慢(尽管更准确)。
如果您编写了2,则该常数将为int类型,将被提升为浮点数,并且计算将使用“浮点精度”进行。一个好的编译器会警告您有关此升级的信息。
在此处阅读有关“常规算术转换”规则的更多信息:
http://msdn.microsoft.com/zh-CN/library/3t4w2bkb%28v=vs.80%29.aspx
float y = x * 2.0;
。实际上,值得付出代价的编译器将为生成单精度乘法float y = x * (double)0.1f;
,这是一项令人印象深刻的壮举(但仍然是正确的优化)。
double
乘法。不允许编译器使用会改变数值结果的优化。2.0
2.0f
(float)((double)float_x * (double)float_y) == float_x * float_y
编译器将逆向应用于此优化的相等性。之所以可行,是因为2double
和的近似float
是相同的。
因为不带后缀的浮点文字是双精度的,所以舍入意味着即使四舍五入的小数文字也可以取不同的值。在以下示例中可以看到:
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");
输出yes
。
可以使用大写或小写字母指定后缀。
也尝试一下:
printf(" %u %u\n", sizeof(.67f), sizeof(.67));
检查@ codepade
在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
通常,差异并不重要,因为编译器无论如何都会将double常量转换为float。但是,请考虑以下事项:
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