gpt4 book ai didi

c++ - std::numeric_limits::quiet_NaN double/float 可以存储一些额外信息吗

转载 作者:太空狗 更新时间:2023-10-29 21:32:50 25 4
gpt4 key购买 nike

在我的数据采集项目中存储双数据时,我使用 std::numeric_limits::quiet_NaN() 识别所有“丢失”的数据。但是,我想存储一些额外的信息以了解为什么数据“丢失”(数据传输丢失、校验和错误、未完成测量、内部错误......)所以我需要许多不同的“nan”值结尾。并且它们必须全部由任何遗留代码 (x!=x) 标识为 NaN。

我在 IEEE 754-1985 中看到NaN 分数可以是“除了所有 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-boxing .它非常被广泛使用,但是没有语言定义的方式来实现它,因为(像往常一样)没有指定位布局。在实际实现中,即使形式上未定义(如果通过 reinterpret_cast 或 union 使用类型双关)或至多未指定(如果使用 memcpybit_cast).

关于c++ - std::numeric_limits::quiet_NaN double/float 可以存储一些额外信息吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53629760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com