繁体   English   中英

浮动或双重特殊值

[英]Float or Double Special Value

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

一个选项是一个包含浮点数和布尔值的包装器,但这不起作用,因为我的库有容器存储双精度而不是表现为双精度的对象。 另一个是使用NaN(std :: numeric_limits)。 但我认为无法检查变量是否为NaN。

如何解决需要“特殊”浮点值来表示数字以外的其他问题?

我们通过使用NaN做到了这一点:

double d = std::numeric_limits<double>::signaling_NaN();
bool isNaN = (d != d);

与自身相等的NaN值将产生错误。 这是你测试NaN的方式,但是如果std::numeric_limits<double>::is_iec559为真,它似乎只有效(如果是这样,它也符合ieee754)。

在C99中,在math.h有一个名为isnan的宏,它也检查NaN值的浮点数。

在Visual C ++中,有一个非标准的_isnan(double)函数可以通过float.h导入。

在C中,有一个isnan(double)函数可以通过math.h导入。

在C ++中,有一个isnan(double)函数可以通过cmath导入。

正如其他人所指出的那样,使用NaN可能会带来很多麻烦。 它们是一种特殊情况,必须像NULL指针一样处理。 不同之处在于NaN通常不会导致核心转储和应用程序故障,但它们很难追踪。 如果您决定使用NaN,请尽可能少地使用它们。 过度使用NaN是一种冒犯性的编码习惯。

它不是内置类型,但我通常使用boost::optional这种事情。 如果你绝对不能使用它,也许指针就可以了 - 如果指针是NULL,那么你知道结果不包含有效值。

一个选项是一个包含浮动广告布尔值的包装器,但这不起作用,因为我的库有容器存储双打而不是表现为双精度的对象。

真是太遗憾了。 在C ++中,创建一个自动转换为实际双(引用)属性的模板化类是微不足道的。 (或者对该问题的任何其他类型的引用。)您只需在模板化类中使用强制转换运算符。 例如:运算符TYPE&(){返回值; 然后,您可以在通常使用double的任何地方使用HasValue <double>。

另一个是使用NaN(std :: numeric_limits)。 但我认为无法检查变量是否为NaN。

正如litbJames Schek所说,C99为我们提供了isnan()。

但要小心! Nan值使数学和逻辑真正有趣! 你认为一个数字不能同时是NOT> = foo和NOT <= foo。 但是对于NaN,它可以。

我在工具箱中保留一个WARN-IF-NAN(X)宏是有原因的。 我过去曾经遇到过一些有趣的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM