Pergunta

limits.h Especifica os limites para tipos de matemática de ponto não flutuante, por exemplo, INT_MIN e INT_MAX. Esses valores são os valores mais negativos e mais positivos que você pode representar usando um int.

Dentro float.h, existem definições para FLT_MIN e FLT_MAX. Se você fizer o seguinte:

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

Você obtém a seguinte saída:

FLT_MIN = 0.000000, FLT_MAX = 340282346638528859811704183484516925440.000000

FLT_MAX é igual a um número realmente grande, como seria de esperar, mas por que FLT_MIN Igual zero em vez de um número negativo realmente grande?

Foi útil?

Solução

Na verdade não é zero, mas pode parecer zero se você inspecioná -lo usando printf ou NSLog usando %f.
De acordo com float.h (pelo menos no Mac OS X 10.6.2), FLT_MIN é descrito como:

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

Note o positivo nessa frase: FLT_MIN refere -se ao número mínimo (normalizado) maior que zero. (Existem números não normalizados muito menores).

Se você deseja o número mínimo de ponto flutuante (incluindo números negativos), use -FLT_MAX.

Outras dicas

O formato '%f' imprime 6 locais decimais em formato fixo. Como FLT_min é muito menor, parece zero em ponto fixo. Se você usar o formato '%e' ou '%g', obterá uma resposta melhor formatada. Da mesma forma com o 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

Sempre que você tentar imprimir o valor de FLT_min do arquivo de cabeçalho padrão Float.h, você obterá 0,000000 (como está vendo na tela de saída). Isso não é realmente um erro. Você está obtendo esse resultado porque o especificador de formato %f. Geralmente %f imprimir 6 dígitos após o ponto decimal, mas neste caso o valor negativo assinado é tão pequeno que você precisa imprimir uma quantidade significativa de dígitos após o ponto decimal.

Eu usei %.54F (dependente da máquina) para obter o resultado desejado (0,0000000000000000000000000000000000000000011754943508222875 para o meu sistema).

// Verifique isso no seu sistema

#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;
}

//Resultado :-

// flutuação mínima assinada 0.00000000000000000000000000000000000000000117549435082228750

// Float mínimo assinado 1.175494E-038

Acho que agora está claro para você por que você está recebendo 0,000000 para char_min e como obter o resultado correto com o mesmo especificador de formato.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top