如何在C ++中有效地实现无穷大和无穷大支持算法?

时间:2012-05-16 04:19:13

标签: c++ math

琐碎的解决方案是:

class Number
{
public: 
    bool isFinite();
    bool isPositive();
    double value();

    ...

private:
    double value_;
    bool isFinite_;
    bool isPositive_;

    ...
};

令我担心的是效率:

来自Effective C ++:55改进程序和设计的具体方法(第3版)作者:Scott Meyers:

  

即使小物件具有廉价的复制构造器,也可以   是性能问题。一些编译器处理内置和用户定义   类型不同,即使它们具有相同的底层   表示。例如,一些编译器拒绝放置对象   尽管他们很开心,但只有一个双人进入一个寄存器   定期在那里裸体双打。当那种事情   碰巧,您最好通过引用传递这些对象,   因为编译器肯定会放指针(执行   参考)到寄存器。

有没有办法绕过效率问题?例如,使用某种汇编语言魔法的库?

2 个答案:

答案 0 :(得分:6)

没有理由为double实现Number类。 double格式已经将Infinity,NaN和signage实现为raw basic double类型的一部分。

其次,您应首先编写代码以确保正确性,然后再尝试优化,此时您可以查看特定数据结构的因素并重写代码和算法。

现代编译器在编写优秀代码时通常非常有效,并且通常比大多数人类程序员做得更好。

答案 1 :(得分:2)

对于特定的示例,我只会使用双打而不是类。它们很好地适应和定义处理无穷大。

从更一般的意义上说,你应该使用简单的解决方案,只有在(或者更有可能的话)成为问题时才会担心性能。

这意味着将其编码并在您将要使用它的许多场景中对其进行测试。

如果它仍然在您的性能要求范围内执行,请不要担心尝试优化它。你应该 某些性能要求稍微具体一点“我希望它尽可能快地运行”: - )

请记住,效率 始终意味着“尽可能快,无论成本”。这意味着实现您的目标,而不必牺牲其他东西(如可读性或可维护性)。

如果您采取完整的操作使用户等待0.1秒并将其优化到快10倍的程度,用户根本不会注意到(我说“完整”,因为显然,用户如果在没有某种中期结果的情况下完成了一万次,会注意到差异。)

请记住,测量,不要猜测!