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

How to efficiently implement infinity and minus infinity supporting arithmetic in C++?

本文关键字:无穷大 支持 实现 C++ 有效地      更新时间:2023-10-16
简单的

解决方案是:

class Number
{
public: 
    bool isFinite();
    bool isPositive();
    double value();
    ...
private:
    double value_;
    bool isFinite_;
    bool isPositive_;
    ...
};

让我担心的是效率:

摘自《有效C++:改进程序和设计的55种具体方法》(第3版(,作者:斯科特·迈耶斯(Scott Meyers(:

即使小对象具有廉价的复制构造函数,也可以 是性能问题。某些编译器处理内置和用户定义的 类型不同,即使它们具有相同的基础 表示法。例如,一些编译器拒绝放置对象 只由一个双打成寄存器组成,即使他们很高兴 定期将裸体双打放在那里。当那种事情 发生时,最好通过引用传递此类对象, 因为编译器肯定会放置指针(实现 引用(放入寄存器。

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

几乎没有

理由为双精度实现 Number 类。 双精度格式已经实现了无限、NaN 和标牌作为原始基本双精度类型的一部分。

其次,你应该先以正确性为目标编写代码,然后再尝试优化,这时你可以查看分解出特定的数据结构并重写代码和算法。

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

对于您的具体示例,我只会按原样使用双精度而不是在类中使用。它们非常适合处理无穷大。

在更一般的意义上,您应该使用微不足道的解决方案,并且只在(或者更有可能,如果(它成为问题时才担心性能。

这意味着要对其进行

编码并在您将要使用它的许多方案中对其进行测试。

如果它仍然在您的性能要求范围内运行,请不要担心尝试优化它。而且你应该有一些更具体的性能要求,比如"我希望它尽可能快地运行":-(

请记住,效率并不总是意味着"无论成本如何,都尽可能快"。这意味着在不必牺牲其他东西(如可读性或可维护性(的情况下实现您的目标。

如果你采取一个完整的操作,让用户等待 0.1 秒,并将其优化到快十倍的程度,用户根本不会注意到这一点(我说"完成"是因为很明显,如果它被完成一万次而没有某种临时结果,用户注意到差异(。

记住,测量,不要猜测!