【问题标题】:Difference between 2.0 and 2.0f (explicit float vs double literals)2.0 和 2.0f 之间的区别(显式浮点数与双字面量)
【发布时间】:2010-09-12 22:19:25
【问题描述】:

我对将f 放在文字值旁边有一些疑问。我知道它将它定义为float,但我真的需要它吗? 这个2.0f * 2.0f 是否比2.0 * 2.0 更快或编译有什么不同?像 float a = 2.0; 这样的语句的编译方式是否与 float a = 2.0f; 不同?

【问题讨论】:

  • 您的意思是“字面值”,而不是“变量名”。 2.0double 文字值。 2.0ffloat 文字值。 2 是一个 int 文字值。这些都不是变量。
  • 抱歉,我的意思不是我在那儿咆哮……我可能应该默默地编辑正文。

标签: c++ c


【解决方案1】:

有时您需要它显式地具有 float 类型,如下例所示

float f = ...;
float r = std::max(f, 42.0); // won't work; (float, double).
float r = std::max(f, 42.0f); // works: both have same type

【讨论】:

    【解决方案2】:

    我很少关注速度(至少直接关注),但事实上编译器会警告将 double 转换为 float

    【讨论】:

    • 好的,但是在 a * 2.0 的例子中,真的使用双倍乘法吗?
    • 理论上,我相信这应该导致将两个doubles 相乘,将结果转换为float。实际上,由于它是 2.0,编译器可能/将会发现它可以在整个过程中使用float。 OTOH,优化 FP 数学(尤其是在 C99 中)存在强制性限制,因此明确说明可能会有所帮助。
    • 是的,我只是以 2.0 为例。感谢您的帮助。
    • 有时,它也与准确性有关。假设您的变量名不反映它们的类型,2.0f 实际上会警告任何其他阅读代码的人,他们需要记住他们处理的是浮点数而不是双精度数的事实。当调试诸如循环之类的东西时,这会变得很方便。
    【解决方案3】:

    AFAIK,在“普通”PC(x86 和 x87-like 数学协处理器)上,速度上的差异是无关紧要的,因为无论如何计算都是在内部以 80 位精度完成的。

    当您需要管理大量浮点数数组(科学计算或类似的东西)时,浮点数可能会变得很重要,因此使用较小的数据类型可能会很方便,既可以使用更少的内存,也可以更快地读取它们从 RAM/磁盘。

    在缺少浮点单元的机器(例如大多数微控制器)上使用浮点数而不是双精度数也可能很有用,其中所有浮点运算都是通过编译器插入的代码在软件中执行的;在这种情况下,浮点运算的速度可能会有所提高(在这种环境中,内存的每一点通常也很重要)。

    在 PC 上,IMO 您可以只在“正常”上下文中使用 double,只是尽量避免在同一个表达式中混合数据类型(double、float、int...)以避免不必要的昂贵转换。无论如何,对于文字,编译器应该足够聪明,可以在编译时执行转换。

    【讨论】:

    • 根据我的阅读,iPhone 处理器是 ARM1176,提供了可选的 FPU(参见此处:arm.com/products/processors/technologies/…);我不是这方面的专家,但在这种情况下,我认为浮点数/双打的速度变化不大。我唯一担心的是它有“16 个双精度或 32 个单精度寄存器”,所以只使用浮点数可能会从额外的寄存器中获得一些东西,但这也可能取决于环境的设置方式。
    • 好吧,我知道你可以,但在 iphone double 上肯定比 float 慢。
    • 唯一的发现方法是分析。无论如何,如果你想安全并且不需要双精度的额外精度,只需使用浮点数。
    • 原来有人已经有类似的问题了:看看stackoverflow.com/questions/1622729/…
    猜你喜欢
    • 1970-01-01
    • 2010-11-06
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多