C++ 浮动或双特殊值

C++ 浮动或双特殊值,c++,floating-point,double,C++,Floating Point,Double,我有可能是“空”的双(或浮点)变量,比如没有有效值。如何用内置类型float和double表示这种情况 一个选项是一个具有浮点和布尔值的包装器,但它不能工作,因为我的库中有存储双精度的容器,而不是行为为双精度的对象。另一种方法是使用NaN(标准::数值限制)。但我看不出有什么方法可以检查变量是否为NaN 我如何解决需要一个“特殊”浮点值来表示数字以外的内容的问题?我们使用NaN实现了这一点: double d = std::numeric_limits<double>::signal

我有可能是“空”的双(或浮点)变量,比如没有有效值。如何用内置类型float和double表示这种情况

一个选项是一个具有浮点和布尔值的包装器,但它不能工作,因为我的库中有存储双精度的容器,而不是行为为双精度的对象。另一种方法是使用NaN(标准::数值限制)。但我看不出有什么方法可以检查变量是否为NaN


我如何解决需要一个“特殊”浮点值来表示数字以外的内容的问题?

我们使用NaN实现了这一点:

double d = std::numeric_limits<double>::signaling_NaN();
bool isNaN = (d != d);
double d=std::numeric_limits::signaling_NaN();
布尔伊斯南=(d!=d);
将NaN值与自身相等进行比较将产生错误。这是测试NaN的方法,但这似乎只有在
std::numeric\u limits::is\u iec559
为真时才有效(如果是,它也符合ieee754)


<99 >在C99中有一个宏,称为“代码> ISNAN/<代码>,用于<代码>数学.H./C>,它检查一个NA值的浮点数。VisualC++中的

< P>,有一个非标准函数,可以通过<代码>浮点导入。 在C语言中,有一个函数可以通过
math.h
导入

在C++中,有一个ISNANN(双)函数,可以通过<代码> CMASUD/COMP> >导入。
正如其他人所指出的,使用NaN可能会带来很多麻烦。它们是一种特殊情况,必须像空指针一样处理。不同之处在于,NaN通常不会导致核心转储和应用程序失败,但很难找到它们。如果你决定用NaN的,尽量少用。过度使用NaN's是一种冒犯性的编码实践。

它不是内置类型,但我通常使用
boost::optional
来处理这种事情。如果你绝对不能使用它,指针可能会起作用——如果指针为空,那么你知道结果不包含有效值。

一个选项是一个包含浮点和布尔值的包装器,但它不能工作,因为“我的库”中有存储双重对象的容器,而不是作为双重对象的对象。

真可惜。在C++中,创建一个模板类,可以自动转换为实际的双(引用)属性,这是微不足道的。(或对任何其他类型的引用)您只需在模板类中使用cast操作符。例如:运算符类型&({return value;}然后,您可以在通常使用double的任何位置使用hasvalues

另一种方法是使用NaN(标准::数值限制)。但我看不出有任何方法可以检查变量是否为NaN。

正如litb和James Schek所说,C99为我们提供了isnan()


但是要小心!Nan值使数学和逻辑变得非常有趣!你可能认为一个数字不能同时是NOT>=foo和NOT,在“”中也可能有一个。谢谢你的链接。他们正确地指出,它的实现取决于它是否在其中。它可能会混入,因为在这些实现中间接地包含math.h。最好是直接在IMHO中包含math.h。无论如何,我还没有发现任何关于标准中NaN的d==d是假的,所以我认为这更像是ieee754的一个特性,而不是C/C++。如果我发现任何与该问题相关的内容,我将更新此答案。更正d!=d->d是ieee754标准的一部分,而不是C/C++标准。。。虽然你不需要关心IBM大型机,但假设IEEE74浮点是你的首选,对于C++用户来说是很安全的。我不确定CISMISO中的ISNN是否是标准的一部分。将更新。isnan不是标准的一部分。因此,它不能保证出现在cmath中。当您的文件中有它时,它是特定于实现的。我将检查这个boost::optional。至于指针ideia,它很好,在大多数情况下都应该工作。不幸的是,我的库想要存储浮点数而不是指针。