在我的数据采集项目中存储双数据时,我使用以下命令识别所有“丢失”的数据std::numeric_limits::quiet_NaN()
。但是,我想存储一些额外的信息来了解为什么数据“丢失”(数据传输丢失、校验和错误、未完成测量、内部错误......),因此我需要在结尾。并且它们都必须被任何遗留代码识别为 NaN (x!=x
).
我看到在IEEE 754-1985 https://en.wikipedia.org/wiki/IEEE_754-1985#NaNNaN 分数可以是“除了所有 0 位之外的任何值(因为所有 0 位代表无穷大)”。可以吗fraction
用于安全地存储一些额外信息?如果是,我该怎么做?这在所有平台和任何编译器上都是完全安全的吗?
这是我的想法:
double GetMyNaN1()
{
double value = std::numeric_limits<double>::quiet_NaN();
// customize it!
return value;
}
double GetMyNaN2()
{
double value = std::numeric_limits<double>::quiet_NaN();
// customize it!
return value;
}
bool IsMyNan1( double value )
{
// return true if value was created by GetMyNaN1()
}
bool IsMyNan2( double value )
{
// return true if value was created by GetMyNaN2()
}
int main()
{
double regular_nan = std::numeric_limits<double>::quiet_NaN();
double my_nan_1 = GetMyNaN1();
double my_nan_2 = GetMyNaN2();
assert( std::isnan( regular_nan ) && !IsMyNan1( regular_nan ) && !IsMyNan2( regular_nan ) );
assert( std::isnan( my_nan_1 ) && IsMyNan1( my_nan_1 ) && !IsMyNan2( my_nan_1 ) );
assert( std::isnan( my_nan_2 ) && !IsMyNan1( my_nan_2 ) && IsMyNan2( my_nan_2 ) );
return 0;
}
该代码必须在所有平台上运行。
这被称为NaN拳击 https://brionv.com/log/2018/05/17/javascript-engine-internals-nan-boxing/. It’s very广泛使用,但没有语言定义的方法来执行此操作,因为(像往常一样)未指定位布局。在实际实现中,只要小心,您就可以通过明显的位操作获得正确的行为,即使形式上它是未定义的(如果您通过以下方式使用类型双关)reinterpret_cast
或联合)或最多未指定(如果您使用memcpy
or bit_cast
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)