代码之家  ›  专栏  ›  技术社区  ›  Nick Forge

为什么flt_min等于零?

  •  24
  • Nick Forge  · 技术社区  · 14 年前

    limits.h 指定非浮点数学类型的限制,例如 INT_MIN INT_MAX . 这些值是可以用int表示的最负和最正的值。

    float.h ,有以下定义: FLT_MIN FLT_MAX . 如果您执行以下操作:

    NSLog(@"%f %f", FLT_MIN, FLT_MAX);
    

    您得到以下输出:

    FLT_MIN = 0.000000, FLT_MAX = 340282346638528859811704183484516925440.000000
    

    最大飞行高度 正如你所期望的那样,等于一个很大的数,但为什么呢? 最小飞行高度 等于零而不是一个很大的负数?

    2 回复  |  直到 10 年前
        1
  •  51
  •   compie    10 年前

    实际上不是零,但如果使用 printf NSLog 通过使用 %f .
    根据 float.h (至少在Mac OS X 10.6.2中) FLT_MIN 描述如下:

    /* Minimum normalized positive floating-point number, b**(emin - 1).  */
    

    注意 积极的 在那句话中: 最小飞行高度 指最小(标准化)数 大于零 . (有更小的非标准化数字)。

    如果需要最小浮点数(包括负数),请使用 -FLT_MAX .

        2
  •  11
  •   Jonathan Leffler vy32    14 年前

    “%f”格式以固定格式打印6位小数。因为flt_min小得多,所以在固定点上看起来是零。如果使用“%e”或“%g”格式,您将得到一个格式更好的答案。与FLT_max类似。

    #include <float.h>
    #include <stdio.h>
    int main(void)
    {
        printf("MIN = %f, MAX = %f\n", FLT_MIN, FLT_MAX);
        printf("MIN = %e, MAX = %e\n", FLT_MIN, FLT_MAX);
        return(0);
    }
    
    
    MIN = 0.000000, MAX = 340282346638528859811704183484516925440.000000
    MIN = 1.175494e-38, MAX = 3.402823e+38