【发布时间】:2012-05-16 04:19:12
【问题描述】:
简单的解决方案是:
class Number
{
public:
bool isFinite();
bool isPositive();
double value();
...
private:
double value_;
bool isFinite_;
bool isPositive_;
...
};
让我担心的是效率:
来自有效的 C++:改进程序和设计的 55 种特定方法(第 3 版),作者:Scott Meyers:
即使小对象有廉价的复制构造函数,也可以 是性能问题。一些编译器处理内置和用户定义 类型不同,即使它们具有相同的底层 表示。例如,一些编译器拒绝放置对象 只包含一个双精度的寄存器,即使他们很高兴 定期在那里放置裸体双打。当那种事 发生时,您最好通过引用传递此类对象, 因为编译器肯定会放置指针(实现 引用)到寄存器中。
有没有办法绕过效率问题?例如一个使用一些汇编语言魔法的库?
【问题讨论】:
-
您是否尝试过查看程序集以查看您的编译器是否正在生成您提到的脑死代码?
-
我很想知道,在您解决了性能问题之后,当操作数为无穷大时,您的算术运算会做什么!
-
我是 C++ 初学者,对汇编语言几乎一无所知。这样的事情超出了我现在的能力。我只是希望有一个众所周知的解决方案。
-
@cheeken 有些操作是定义好的,en.wikipedia.org/wiki/Extended_real_number_line,有些会返回NaN,或者抛出异常。这样的算术例如在 Mathematica 中实现
-
@MartinDrozdik 实际上,对于操作的子集,“无限操作”可以是确定性的。但其中许多不是,涉及它们的计算集似乎会迅速转变为
NaN的池。对我来说,这引出了一个问题:这是正确的方法吗?