template <class T>
MyClass
{
public:
// ...
void MyMethod(T dbNumber)
{
// ...
T dbResult = do_some_operation_on_dbnumber(dbNumber);
if (IsInfinite(dbResult))
{
// ...
}
else if (IsIndefinite(dbResult))
{
// ...
}
else
{
// ...
}
// ...
}
static bool IsInfinite(T dbNumber)
{
// How do I implement this?
}
static bool IsIndefinite(T dbNumber)
{
// How do I implement this?
}
// ...
};
我的代码中有一个数学运算,有时会在模板变量中返回无限且不确定的结果。我想抓住这些无限期的结果。我该怎么做?
答案 0 :(得分:6)
#include <limits>
using namespace std;
double d = 1.0 / 0.0;
if (d == numeric_limits<double>::infinity( ))
cout << "Its infinite, all right" << endl;
else
cout << "Not in my book" << endl;
这很有效。
答案 1 :(得分:1)
如果您知道您的代码是在使用IEEE表示的处理器上运行的,那么您可以检查位模式是否与无穷大相匹配,这在指数字段中都是“1”。也就是说,您可以按位 - 和0x7ff0000000000000的数字,并检查它是否等于该数字。如果是,则可以检查较低有效位是0还是不为零。 0表示无穷大,而0表示NaN。您需要进行64位类型的转换才能进行比较。
这一切都假定您正在使用双精度浮点数,并且您可以执行此操作可以转换为64位整数类型。如果你不能转换为64位,你需要担心字符串问题。对于单精度浮点数,它类似,但是转换为32位整数,并使用常量0x7f800000。对于四倍精度,它是相似的,但更复杂,因为你需要担心字节序,因为没有128位整数类型,很容易放入你的代码。您检查的常数是不同的,但可以从IEEE 754规范中推断出来。