我最近在IEEE 754和x87架构上读了很多。 我正在考虑在我正在使用的一些数字计算代码中使用NaN作为“缺失值”,并且我希望使用NaN 信号发送将允许我在不希望出现的情况下捕获浮点exception着手“缺失的价值”。 相反,我会用安静的 NaN让“缺失值”通过计算传播。 然而,信号NaN不能正常工作,因为我认为它们是基于存在于其上的非常有限的文档。 这里是我所知道的一个总结(所有这些使用x87和VC ++): _EM_INVALID(IEEE“无效”exception)在遇到NaN时控制x87的行为 如果_EM_INVALID被屏蔽(exception被禁用),则不会产生exception,操作可以返回安静的NaN。 涉及NaN信号的操作不会引发exception,但会被转换为安静的NaN。 如果_EM_INVALID未被屏蔽(例外启用),一个无效的操作(例如,sqrt(-1))会导致一个无效的exception被抛出。 x87 永远不会产生信号NaN。 如果_EM_INVALID未被屏蔽, 任何使用信号NaN(甚至用它初始化一个variables)都会导致一个无效的exception被抛出。 标准库提供了一种访问NaN值的方法: std::numeric_limits<double>::signaling_NaN(); 和 std::numeric_limits<double>::quiet_NaN(); 问题是我看不到任何信号NaN。 如果_EM_INVALID被屏蔽,则其行为与安静的NaN完全相同。 由于没有NaN与任何其他NaN相比,没有逻辑差异。 如果_EM_INVALID 没有被屏蔽(exception被启用),那么甚至不能用信号发送一个variablesNaN: double dVal = std::numeric_limits<double>::signaling_NaN(); 因为这会引发一个exception(信号NaN值被加载到一个x87寄存器中以将其存储到存储器地址中)。 你可能会像我这样想: 掩码_EM_INVALID。 用信号NaN初始化variables。 Unmask_EM_INVALID。 但是,步骤2会导致信号NaN转换为安静的NaN,所以后续使用它不会引发exception! 那么WTF? 信号NaN有没有用处或目的? 我明白其中一个原意是用它初始化内存,以便可以捕获到单位浮点值的使用。 有人可以告诉我,如果我在这里失去了一些东西? 编辑: 为了进一步说明我希望做的事情,下面是一个例子: 考虑对数据向量执行math运算(双精度)。 对于某些操作,我想允许向量包含一个“缺失值”(假设这对应于一个电子表格列,例如,其中一些单元格没有值,但它们的存在是显着的)。 对于某些操作,我不想让vector包含“缺失值”。 也许我想采取一个不同的行动方式,如果一个“缺失的价值”是存在的设置 – 也许执行一个不同的操作(因此这不是一个无效的状态)。 这个原始代码看起来像这样: const double MISSING_VALUE = 1.3579246e123; using […]