gpt4 book ai didi

c - float 小于 FLT_MIN。为什么是 FLT_TRUE_MIN?

转载 作者:太空狗 更新时间:2023-10-29 17:18:24 28 4
gpt4 key购买 nike

在尝试查看在 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。

  1. 是否有更有效的方法来证明数据类型的限制?
  2. 为什么 FLT_MIN 实际上不是最小的浮点值?我应该使用其他常量吗?输入上一个问题后,我发现 FLT_TRUE_MIN。这个号码是多少?

最佳答案

获得“低于最低限度”的 2 种可能性:

  1. 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

  2. 数学执行为 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/

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