NaN、IND、INF和DEN的概念 在C++中找到了: 试图解释C++中计算方法中如何以及(以及其他特殊的数值类型)的概念。

NaN、IND、INF和DEN的概念 在C++中找到了: 试图解释C++中计算方法中如何以及(以及其他特殊的数值类型)的概念。,c++,C++,它足够清晰,可以使用标准库代码显示每个数字的“标准表示法”类型,但有点混乱的是出于“学术”兴趣给出的“非标准表示法” 标准表示形式如下所示: const double STD_NOT_A_NUMBERD = std::numeric_limits<double>::quiet_NaN(); const unsigned long lnNAN[2] = {0x00000000, 0x7ff80000}; // "Define an array of size 2 of type lo

它足够清晰,可以使用标准库代码显示每个数字的“标准表示法”类型,但有点混乱的是出于“学术”兴趣给出的“非标准表示法”

标准表示形式如下所示:

const double STD_NOT_A_NUMBERD = std::numeric_limits<double>::quiet_NaN();
const unsigned long lnNAN[2] = {0x00000000, 0x7ff80000}; // "Define an array of size 2 of type long."
const double NOT_A_NUMBER = *( double* )lnNAN; // "Now, cast it to a double value!"

当然,我已经测试了所有这些,并且这两种表示都以各自的数字形式(非规范化、不确定、无穷大和NaN)进行了逃避,但问题是:

在这些非标准表示中发生了什么? 更具体地说,这里如何将数组转换为数字,为什么所述数组中的值特定于每个数字形式


以下是每个“特殊”编号的代码:

•非规范化 •无限
/*非标准表示法*/
常量无符号长lnINF[2]={0x00000000,0x7ff00000};
常数double AN _无穷大_正数=*(double*)lnINF;
/*标准代表*/
const double STD_AN _(无限)正=STD::numeric_limits::INFINITY();
•非数字(NaN)
/*非标准表示法*/
常量无符号长lnNAN[2]={0x00000000,0x7ff80000};
常数double NOT_A_NUMBER=*(double*)lnNAN;
/*标准代表*/
const double STD_NOT_A_NUMBERD=STD::numeric_limits::quiet_NaN();

这里的一切都是未定义的行为。这些表格正是在中列出的,它们非常标准。它之所以有效,是因为这些值具有相同的位。这就像
chara[2]={0xff,0xff};uint16_t b=*(uint16_t*)a;断言(b==0xffff)猜得不错。当然,真正的情况是,这就是为什么我们依赖标准库来做这类事情。请注意,非规范(又称次规范)对不同的值有多个表示,并且有两种类型的NAN(信令与静默/非信令)也有多个表示。
*(double*)lnDEN
等是未定义的行为(严格的别名冲突)。您的“不确定”只是
-nan
。这里的一切都是未定义的行为。这些表格正是在中列出的,它们非常标准。它之所以有效,是因为这些值具有相同的位。这就像
chara[2]={0xff,0xff};uint16_t b=*(uint16_t*)a;断言(b==0xffff)猜得不错。当然,真正的情况是,这就是为什么我们依赖标准库来做这类事情。请注意,非规范(又称次规范)对不同的值有多个表示,并且有两种类型的NAN(信令与静默/非信令)也有多个表示。
*(double*)lnDEN
等是未定义的行为(严格的别名冲突)。您的“不确定”只是
-nan
/* Non-Standard Representation */
const unsigned long lnDEN[2] = {0x00000001, 0x00000000};
const double A_DENORMAL  = *( double* )lnDEN;

/* Standard Representation */
double dDEN = std::numeric_limits<double>::denorm_min();
/* Non-Standard Representation */
const unsigned long lnIND[2] = {0x00000000, 0xfff80000};
const double AN_INDETERMINATE  = *( double* )lnIND;

/* Standard Representation */
// ???
/* Non-Standard Representation */
const unsigned long lnINF[2] = {0x00000000, 0x7ff00000};
const double AN_INFINITY_POSITIVE  = *( double* )lnINF;

/* Standard Representation */
const double STD_AN_INFINITY_POSITIVE = std::numeric_limits<double>::infinity();
/* Non-Standard Representation */
const unsigned long lnNAN[2] = {0x00000000, 0x7ff80000};
const double NOT_A_NUMBER = *( double* )lnNAN;

/* Standard Representation */
const double STD_NOT_A_NUMBERD = std::numeric_limits<double>::quiet_NaN();