limits.h
specifies limits for non-floating point math types, e.g. INT_MIN
and INT_MAX
. These values are the most negative and most positive values that you can represent using an int.
In float.h
, there are definitions for FLT_MIN
and FLT_MAX
. If you do the following:
NSLog(@"%f %f", FLT_MIN, FLT_MAX);
You get the following output:
FLT_MIN = 0.000000, FLT_MAX = 340282346638528859811704183484516925440.000000
FLT_MAX
is equal to a really large number, as you would expect, but why does FLT_MIN
equal zero instead of a really large negative number?
It's not actually zero, but it might look like zero if you inspect it using printf
or NSLog
by using %f
.
According to float.h
(at least in Mac OS X 10.6.2), FLT_MIN
is described as:
/* Minimum normalized positive floating-point number, b**(emin - 1). */
Note the positive in that sentence: FLT_MIN
refers to the minimum (normalized) number greater than zero. (There are much smaller non-normalized numbers).
If you want the minimum floating point number (including negative numbers), use -FLT_MAX
.
The '%f' format prints 6 decimal places in fixed format. Since FLT_MIN is a lot smaller, it looks like zero in fixed point. If you use '%e' or '%g' format, you'd get a better formatted answer. Similarly with the 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
Whenever you will try to print the value of FLT_MIN from standard header file float.h ,you will get 0.000000(as you are seeing in your output screen). That is not actually a error. You are getting this result because the format specifier %f. Generally %f print 6 digits after the decimal point but in this case the signed negative value is so small that you need to print significant amount of digits after the decimal point.
I have used %.54f(machine dependent) to get the desired- result(0.000000000000000000000000000000000000011754943508222875 for my system).
//Check this on your system
#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;
}
//Output :-
// Minimum signed float 0.0000000000000000000000000000000000000117549435082228750
// Minimum signed float 1.175494e-038
I think now it's clear to you why you are getting 0.000000 for CHAR_MIN and how to get the correct result with the same format specifier.Though you can use %e for better formatted result.
来源:https://stackoverflow.com/questions/2528039/why-is-flt-min-equal-to-zero