我应该对包含无效值的数据集使用浮点数NaN或浮点数+布尔值吗?

时间:2012-03-05 21:23:12

标签: c++ performance floating-point nan

我需要处理大量数据,并对每个数据集进行数学密集型操作。其中大部分类似于图像处理。但是,由于直接从物理设备读取此数据,因此许多像素值可能无效。

这使得NaN的属性表示非数字的值,并且在算术运算上的扩展非常引人注目。然而,它似乎也需要关闭一些优化,如gcc的-ffast-math,而且我们需要跨平台。我们当前的设计使用一个简单的结构,它包含一个浮点值和一个指示有效性的bool。

虽然似乎是NaN was designed with this use in mind, 其他人认为这是more trouble than it is worth。有没有人根据他们对IEEE754的更亲密的经验提出建议并考虑到性能?

2 个答案:

答案 0 :(得分:3)

如果无效数据很常见,您当然会浪费大量时间在处理过程中运行此数据。如果无效数据足够通用,那么最好只运行某种有效数据的稀疏数据结构。如果它不常见,您当然可以保持稀疏数据结构中哪些数据无效。这样你就不会为每个值浪费一个bool。但也许记忆对你来说不是问题......

如果您正在执行诸如将两个可能无效的数据条目相乘的操作,我理解使用NaN而不是对两个变量进行检查以确定它们是否有效并在结果中设置相同的标志是非常有用的。

您需要多么便携?您是否需要能够将其移植到仅具有定点支持的架构?如果是这种情况,我认为您的选择很明确。

就个人而言,如果证明它更快,我只会使用NaN。否则,如果你明确处理了无效数据,我会说代码会变得更清晰。

答案 1 :(得分:2)

由于浮点数来自设备,因此它们的范围可能有限。您可以使用其他一些特殊号码而不是NaN来表示数据的缺失,例如1E37。该解决方案是便携式的我不知道你是否比使用布尔旗更方便。