- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我试图在一个循环中确定 DBL_MIN(为了测试另一个问题),我对输出感到惊讶:
double tmp(1.0);
double min(tmp);
while(tmp>0)
{
tmp/=2.0;
if(tmp>0) min=tmp;
else break;
}
cout<<scientific<<endl;
cout<<"Computed minimum: "<<min<<endl;
cout<<"Defined minimum: "<<DBL_MIN<<endl;
if(min>0 && min<DBL_MIN) cout<<"min is between 0 and DBL_MIN, HUH!"<<endl;
exit(1);
输出是:
Computed minimum: 4.940656e-324
Defined minimum: 2.225074e-308
min is between 0 and DBL_MIN, HUH!
当最小的正值为 2.2e-308 时,min 如何保持值 4.94e-324 ?据我了解,低于 DBL_MIN 的正值不应表示。在 Linux 下的 Core i7 上使用 GCC 4.9.2 进行测试。
最佳答案
DBL_MIN
是 double 的最小标准化正值。这意味着这是尾数不小于 1.0
的最小值。如果您选择较小的尾数,您仍然可以选择较小的数字。
所以你得到的是Denormal number .正如维基百科所说,
In a normal floating-point value, there are no leading zeros in the significand; instead leading zeros are moved to the exponent. So 0.0123 would be written as 1.23 × 10−2. Denormal numbers are numbers where this representation would result in an exponent that is below the minimum exponent (the exponent usually having a limited range). Such numbers are represented using leading zeros in the significand.
IEEE 754 standard管理 double
(和其他浮点类型)的表示。表示由指数 e
和尾数 m
(和符号位,与本题无关)组成。
对于指数e
不等于零,对应的double
值为
(1 + m/2^52) * 2^(e-1023)
(^
代表幂,52是m
中的位数,所以m/2^52
总是介于0 个包含和 1 个不包含)。隐含的(不包含在m
中)1
表示这样可以存储的最小数对应于m==0
和e==1
(记住 e!=0
对于这个表示),它给出了
2^(-1022)
这大约是。 2.225074e-308
,即DBL_MIN
。
但是,e==0
被特殊对待。对于 e==0
,隐含的 1
被丢弃,导致
(m / 2^52) * 2^(-1022) // remember that e==0
这允许表示精确的零(使用 m==0
),也可以表示较小的 m
的次正规(或非正规)。对于 m==1
,最小可能的数字是 2^(-1074)
,或大约。 4.940656e-324
。
关于c++ - 在循环中确定 DBL_MIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33869569/
我试图在一个循环中确定 DBL_MIN(为了测试另一个问题),我对输出感到惊讶: double tmp(1.0); double min(tmp); while(tmp>0) { tmp/=2
我将 0.4543543234343654632452452525254e-323 分配给 double 变量 a 并打印它,尽管它小于 DBL_MIN,它仍然可以分配和打印。 DBL_MAX: 1.
问:DBL_MIN 是最小的正 double 吗? 下面的代码似乎没有回答这个问题。但如果这是真的,那么 DBL_MIN 是如何定义的,它的用途或目的是什么。 平台:Windows7 & Visual
我的一个函数返回一个 double,我想用一个无效值来指示错误条件,例如 DBL_MIN、DBL_MAX 或 -DBL_MAX。 #include #include #include doubl
在求 double 的平方根倒数时,将无效的非正输入限制在 0.0 或 MIN_DBL 哪个更好? (在我下面的示例中 double b 可能由于浮点舍入错误而最终为负,并且因为物理定律在游戏中略微被
为什么表达式 DBL_MIN 0.0 { print("3. DBL_MIN is larger than zero?") // prints (unexpected) } if DBL_M
此程序在第一个命令行参数上调用 strtod() 并打印返回值: #include #include #include #include int main(int argc, char **a
我是一名优秀的程序员,十分优秀!