Почему FLT_MIN равен нулю? - PullRequest
26 голосов
/ 27 марта 2010

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

FLT_MAX равно действительно большому числу, как и следовало ожидать, но почему FLT_MIN равно нулю вместо действительно большого отрицательного числа?

Ответы [ 3 ]

54 голосов
/ 27 марта 2010

На самом деле это не ноль, но он может выглядеть как ноль, если вы проверите его с помощью printf или NSLog с помощью %f.
Согласно float.h (по крайней мере, в Mac OS X 10.6.2), FLT_MIN описывается как:

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

Обратите внимание на положительный в этом предложении: FLT_MIN относится к минимальному (нормализованному) числу больше нуля . (Есть намного меньшие ненормализованные числа).

Если вы хотите минимальное число с плавающей запятой (включая отрицательные числа), используйте -FLT_MAX.

12 голосов
/ 27 марта 2010

Формат '% 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
0 голосов
/ 03 мая 2019

Всякий раз, когда вы пытаетесь напечатать значение FLT_MIN из стандартного заголовочного файла float.h, вы получите 0,000000 (как вы видите на экране вывода). Это на самом деле не ошибка. Вы получаете этот результат, потому что спецификатор формата% f. Обычно% f выводит 6 цифр после десятичной запятой, но в этом случае отрицательное значение со знаком настолько мало, что вам необходимо напечатать значительное количество цифр после запятой.

Я использовал% .54f (зависит от машины), чтобы получить желаемый результат (0,000000000000000000000000000000000000011754943508222875 для моей системы).

// Проверьте это в вашей системе

#include<stdio.h>
#include<float.h>
int main()
{
    printf("Minimum signed float %.55f\n",FLT_MIN);
    printf("Minimum signed float %e\n",FLT_MIN);
    return 0;
}

// Вывод: -

// Минимальное число с плавающей запятой 0,0000000000000000000000000000000000000117549435082228750

// Минимальное число с плавающей запятой 1.175494e-038

Я думаю, теперь вам понятно, почему вы получаете 0,000000 за CHAR_MIN и как чтобы получить правильный результат с тем же спецификатором формата. Хотя вы можете использовать% e для лучшего форматированного результата.

...