2

Are there any lower bounds for floating point types in C? Like there are lower bounds for integral types (int being at least 16 bits)?

Roman Nikitchenko
  • 12,800
  • 7
  • 74
  • 110
Geekhero
  • 21
  • 2
  • 1
    Hi Geekhero, welcome to StackOverflow. If you wish to reply in the comments, at the bottom of your own question there is a grey text link which reads "add comment." This is how people communicate with each other here. – Heath Hunnicutt Nov 11 '09 at 09:17
  • do you want to map floats to fewer bits (less accuracy) ? – Nick Dandoulakis Nov 11 '09 at 09:19
  • 1
    You cannot comment with only 1 reputation point. – ndim Nov 11 '09 at 09:19
  • 2
    @ndim: Yes you can. "you can always comment on your questions and answers, and any answers to questions you've asked, even with 1 rep." (faq) – fresskoma Nov 11 '09 at 16:35

7 Answers7

3

Yes. float.h contains constants such as:

FLT_EPSILON, DBL_EPSILON, LDBL_EPSILON this is the least magnitude non-zero value which can be represented by float, double, and long double representations.

FLT_MAX and FLT_MIN represent the extreme positive and negative numbers which can be represented for float. Similar DBL_ and LDBL_ are available.

FLT_DIG, DBL_DIG, LDBL_DIG are defined as the number of decimal digits precision.

You are asking for either the xxx_MIN or the xxx_EPSILON value.

Along these lines, here is a question wherein I posted some code which displays the internals of a 64-bit IEEE-754 floating-point number.

Community
  • 1
  • 1
Heath Hunnicutt
  • 18,667
  • 3
  • 39
  • 62
  • 1
    That wasn't the question. Geekhero is asking for the bounds which the language puts on those constants, not how to get the values in a particular implementation. – Steve Jessop Nov 11 '09 at 16:35
  • Surely you realize the bounds are not defined by the language standard, but by the implementation? And that most implementations adhere to IEEE-754? But the OP can't count on that because the answer will vary by platform? – Heath Hunnicutt Nov 11 '09 at 17:34
  • 1
    The language standard defines bounds *on the bounds*. The OP says "like ... int being at least 16 bits". Similarly, float represents at least 6 decimal places. If it represents more, then FLT_DIG will be greater than 6, but it must not be less. – Steve Jessop Nov 11 '09 at 18:14
  • Steve, your point of view might be a better answer to the OP's question. You should add an answer. – Heath Hunnicutt Nov 11 '09 at 18:40
  • Unless you would like to community wiki this answer I wrote, I'd be glad to change it, but usually when I transform to wiki, nobody participates in the edits but me. – Heath Hunnicutt Nov 11 '09 at 18:41
  • Roman, ndim, and Konamiman's answers are to the question that I think was intended: they all point to lists of the minimum values required for the constants you mention (although they each chose different references, so I suppose there's something to be said for one answer to rule them all...) – Steve Jessop Nov 11 '09 at 19:03
3

To be strict and grounded:

ISO/IEC 9899:TC2: (WG14/N1124m May 6, 2005):

5.2.4.2.2, Characteristics of floating types <float.h>

Roman Nikitchenko
  • 12,800
  • 7
  • 74
  • 110
2

float.h contains many macros describing various properties of the floating types (including FLT_MIN and DBL_MIN).

The description of the requirements of the limits infloat.h is given in the standard (C90 or C99 - 5.2.4.2.2 "Characteristics of floating types").

In particular, according to the standard any implementation must support a lower-bound of at least 1E-37 for float or double. But an implementation is free to do better than that (and indicate what it does in FLT_MIN and DBL_MIN).

See this question for information on where to get a copy of the standards documents if you need one:

Community
  • 1
  • 1
Michael Burr
  • 333,147
  • 50
  • 533
  • 760
  • 1
    That wasn't the question. Geekhero is asking for the bounds which the language puts on those constants, not how to get the values in a particular implementation – Steve Jessop Nov 11 '09 at 16:35
  • The question can probably be reasonably interpreted either way. Regardless, a better answer would discuss both areas (they're still kind of the same answer - the documentation for `float.h` talks about the required limits for an implementation, the contents of a particular `float.h` describe a particular implementation's limits. I've updated the answer to try to better cover both angles. – Michael Burr Nov 11 '09 at 17:34
1

Maybe this helps: float.h reference (it is C++, I'm not sure if it applies to plain C as well)

Konamiman
  • 49,681
  • 17
  • 108
  • 138
1

This Draft C99 standard (PDF) notes minimum values for floating point type precision in section 5.2.4.2.2.

(Found via Wikipedia on C99.)

ndim
  • 35,870
  • 12
  • 47
  • 57
0

A useful reference here is What Every Computer Scientist Should Know About Floating-Point Arithmetic.

The nature of a floating point number — its size, precision, limits — is really defined by the hardware, rather than the programming language. A single-precision float on an x86 is the same in C, C#, Java, and any other practical programming language. (The exception is esoteric programming languages that implement odd widths of floating point number in software.)

Crashworks
  • 40,496
  • 12
  • 101
  • 170
0

Excerpts from the Standard draft (n1401.pdf)

                                      Annex F
                                    (normative)
                       IEC 60559 floating-point arithmetic
    F.1 Introduction
1   ... An implementation that defines _ _STDC_IEC_559_ _ shall conform to
    the specifications in this annex. ...

    F.2 Types
1   The C floating types match the IEC 60559 formats as follows:
    -- The float type matches the IEC 60559 single format.
    -- The double type matches the IEC 60559 double format.
    -- The long double type matches an IEC 60559 extended format ...

Wikipedia has an article about IEC 559 (or rather IEEE 754-1985) you might find interesting.

pmg
  • 106,608
  • 13
  • 126
  • 198