- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在尝试查看在 float 下溢的情况下会发生什么情况时,我发现我可以使 float 比 FLT_MIN 小得多。我在 OS 10.9 上使用 xcode 5.1。语言方言是 gnu99。
#include <stdio.h>
#include <stdlib.h>
#include <float.h>
int main(int argc, const char * argv[])
{
float underflow = FLT_MIN * 0.0000004;
printf("Float min is %f or %e.\nUnderflow is %f or %e\nMin float exp is %d.\n", FLT_MIN, FLT_MIN, underflow, underflow, FLT_MIN_10_EXP);
return 0;
}
打印:
最小 float 为 0.000000 或 1.175494e-38。
下溢为 0.000000 或 4.203895e-45
最小 float exp 是 -37。
最佳答案
获得“低于最低限度”的 2 种可能性:
float
范围:
典型 float
数字有 2 个范围:从 FLT_MAX
开始的全精度(正常范围)下降到 FLT_MIN
和精度从 FLT_MIN
降低的第二个范围下降到 FLT_TRUE_MIN
.这第二个范围称为“次正常”,通常提供大约 10^-7 个范围。
FLT_TRUE_MIN
is the "minimum positive floating-point number"
FLT_MIN
is the "minimum normalized positive floating-point number"
FLT_MIN_10_EXP
is the "minimum negative integer such that 10 raised to that power is in the range of normalized floating-point numbers"C11dr §5.2.4.2.2
一般0 < FLT_TRUE_MIN <= FLT_MIN <= 10^FLT_MIN_10_EXP <= 10^-37
数学执行为 double
.
printf()
隐藏每个float
传递给了一个 double
. C 允许代码进行优化,以便将值传递给 printf()
可能是 double
FLT_MIN * 0.0000004
的产品.
float underflow = FLT_MIN * 0.0000004;
printf("%e\n", underflow);
如果输出是 4.701976e-45
而不是 4.203895e-45
,本来就是这种情况。
关于“亚正常”的注释。 次正规(或非正规)数的一个令人信服的原因在于以下问题。
float a,b;
... // somehow a and b are set.
// Are the 2 below equivalent?
if (a == b) foo();
if ((a - b) == 0) foo();
在没有次正规数的情况下,FLT_MIN
附近有 2 个几乎相同的值数将有远低于 FLT_MIN
的非零数学差异结果将四舍五入为 0.0
.
对于次正规数,每对不同的 float
的差值s 可以用 0.0
以外的东西表示. **
** 除了 +0.0, -0.0
.带符号的零有其自身的特点。
关于c - float 小于 FLT_MIN。为什么是 FLT_TRUE_MIN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25705287/
在尝试查看在 float 下溢的情况下会发生什么情况时,我发现我可以使 float 比 FLT_MIN 小得多。我在 OS 10.9 上使用 xcode 5.1。语言方言是 gnu99。 #inclu
我是一名优秀的程序员,十分优秀!