In C++ (or maybe only our compilers VC8 and VC10) 3.14
is a double literal and 3.14f
is a float literal.
现在我有一个同事说:
我们应该使用浮点文字进行浮点计算,使用双精度文字进行双精度计算,因为在计算中使用常量时,这可能会影响计算的精度。
具体来说,我认为他的意思是:
double d1, d2;
float f1, f2;
... init and stuff ...
f1 = 3.1415 * f2;
f1 = 3.1415f * f2; // any difference?
d1 = 3.1415 * d2;
d1 = 3.1415f * d2; // any difference?
或者,由我添加,甚至:
d1 = 42 * d2;
d1 = 42.0f * d2; // any difference?
d1 = 42.0 * d2; // any difference?
更一般地说,only我可以看到使用的点2.71828183f
是为了确保我试图指定的常量实际上适合浮点数(否则编译器错误/警告)。
有人可以解释一下吗?您是否指定f
后缀?为什么?
引用一个我认为理所当然的答案:
如果您正在使用浮点变量和双精度文字,则整个
操作将以双精度完成,然后转换回浮点。
这可能有什么坏处吗? (除了非常非常理论上的性能影响?)
进一步编辑:如果包含技术细节(赞赏!)的答案还可以包括这些差异如何影响通用代码。 (是的,如果您正在处理数字,您可能希望确保您的 big-n 浮点运算尽可能高效(且正确)——但是对于被调用几次的通用代码来说这重要吗?如果代码只使用它会更干净0.0
并跳过了——难以维护! -- 浮动后缀?)
是的,您应该使用f
后缀。原因包括:
表现。当你写的时候float foo(float x) { return x*3.14; }
,您强制编译器发出将 x 转换为 double 的代码,然后进行乘法,然后将结果转换回 single。如果您添加f
后缀,则两个转换都被消除。在许多平台上,每次转换的成本都与乘法本身一样昂贵。
性能(续)。在某些平台(例如大多数手机)上,双精度算术比单精度算术慢得多。即使忽略转换开销(在 1. 中介绍),每次强制计算以双倍计算时,都会减慢程序速度。这不仅仅是一个“理论”问题。
减少接触错误的机会。考虑这个例子float x = 1.2; if (x == 1.2) // something;
Is something
被处决?不,不是,因为 x 成立1.2
四舍五入为float
,但正在与双精度值进行比较1.2
。两者并不相等。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)