From 62e3884ecdebd557ce95b63481f7c8f733831362 Mon Sep 17 00:00:00 2001 From: nsz Date: Fri, 22 Jul 2011 22:02:49 +0200 Subject: [PATCH] fix manual n1256 (para, notes) --- n1256.html | 215 ++++++++++++++++++++++++++--------------------------- 1 file changed, 107 insertions(+), 108 deletions(-) diff --git a/n1256.html b/n1256.html index c8996bb..1c784ea 100644 --- a/n1256.html +++ b/n1256.html @@ -1,6 +1,5 @@ WG14/N1256 Septermber 7, 2007 ISO/IEC 9899:TC3 -
-
+

 WG14/N1256                Committee Draft -- Septermber 7, 2007                   ISO/IEC 9899:TC3
 
 
@@ -1628,7 +1627,6 @@ WG14/N1256                Committee Draft -- Septermber 7, 2007
  representation of floating-point numbers and values that provide information about an
  implementation's floating-point arithmetic.16) The following parameters are used to
  define the model for each floating-point type:
-

         s          sign ((+-)1)
         b          base or radix of exponent representation (an integer > 1)
@@ -1636,6 +1634,7 @@ WG14/N1256                Committee Draft -- Septermber 7, 2007
         p          precision (the number of base-b digits in the significand)
         fk         nonnegative integers less than b (the significand digits)
 
+

A floating-point number (x) is defined by the following model:

                     p
@@ -2277,7 +2276,7 @@ WG14/N1256                Committee Draft -- Septermber 7, 2007
  qualifiers (if any) of the type from which it is derived.
 

A pointer to void shall have the same representation and alignment requirements as a - pointer to a character type.39) Similarly, pointers to qualified or unqualified versions of + pointer to a character type.39) Similarly, pointers to qualified or unqualified versions of compatible types shall have the same representation and alignment requirements. All @@ -2678,7 +2677,6 @@ WG14/N1256 Committee Draft -- Septermber 7, 2007 the result, whose type domain is the type domain of the operands if they are the same, and complex otherwise. This pattern is called the usual arithmetic conversions: -

  • First, if the corresponding real type of either operand is long double, the other operand is converted, without change of type domain, to a type whose @@ -2708,6 +2706,7 @@ WG14/N1256 Committee Draft -- Septermber 7, 2007 corresponding to the type of the operand with signed integer type.
+

The values of floating operands and of the results of floating expressions may be represented in greater precision and range than that required by the type; the types are not changed thereby.52) @@ -3376,7 +3375,6 @@ unsigned long long int The single-quote ', the double-quote ", the question-mark ?, the backslash \, and arbitrary integer values are representable according to the following table of escape sequences: -

         single quote '                 \'
         double quote "                 \"
@@ -3385,6 +3383,7 @@ unsigned long long int
         octal character                \octal digits
         hexadecimal character          \x hexadecimal digits
 
+

The double-quote " and question-mark ? are representable either by themselves or by the escape sequences \" and \?, respectively, but the single-quote ' and the backslash \ shall be represented, respectively, by the escape sequences \' and \\. @@ -4576,7 +4575,6 @@ unsigned long long int expression (Q)+1 does not point to an element of the array object.91)

EXAMPLE Pointer arithmetic is well defined with pointers to variable length array types. -

           {
                    int n = 4, m = 3;
@@ -4587,6 +4585,7 @@ unsigned long long int
                    n = p - a;                  //   n == 1
           }
 
+

If array a in the above example were declared to be an array of known constant size, and pointer p were declared to be a pointer to an array of the same known constant size (pointing to a), the results would be the same. @@ -5526,11 +5525,11 @@ unsigned long long int

and assuming that the calls to malloc succeed, the objects pointed to by s1 and s2 behave, for most purposes, as if the identifiers had been declared as: -

           struct { int n; double d[8]; } *s1;
           struct { int n; double d[5]; } *s2;
 
+

Following the further successful assignments:

           s1 = malloc(sizeof (struct s) + 10);
@@ -5541,7 +5540,6 @@ unsigned long long int
           struct { int n; double d[1]; } *s1, *s2;
 
and: -

           double *dp;
           dp = &(s1->d[0]);           //   valid
@@ -5549,6 +5547,7 @@ unsigned long long int
           dp = &(s2->d[0]);           //   valid
           *dp = 42;                   //   undefined behavior
 
+

The assignment:

           *s1 = *s2;
@@ -5689,7 +5688,7 @@ unsigned long long int
 
occurs other than as part of one of the above forms, and no other declaration of the identifier as a tag is visible, then it declares an incomplete structure or union type, and - declares the identifier as the tag of that type.113) + declares the identifier as the tag of that type.113)

If a type specifier of the form

@@ -5960,7 +5959,6 @@ unsigned long long int
  function call and an equivalent nested block. With one exception, only ''outer-to-inner'' assignments
  between restricted pointers declared in nested blocks have defined behavior.
 
-

           {
                    int * restrict p1;
@@ -5974,6 +5972,7 @@ unsigned long long int
                    }
           }
 
+

The one exception allows the value of a restricted pointer to be carried out of the block in which it (or, more precisely, the ordinary identifier used to designate it) is declared when that block finishes execution. For example, this permits new_vector to return a vector. @@ -6036,7 +6035,6 @@ unsigned long long int EXAMPLE The declaration of an inline function with external linkage can result in either an external definition, or a definition available for use only within the translation unit. A file scope declaration with extern creates an external definition. The following example shows an entire translation unit. -

           inline double fahr(double t)
           {
@@ -6053,6 +6051,7 @@ unsigned long long int
                 return is_fahr ? cels(temp) : fahr(temp);
           }
 
+

Note that the definition of fahr is an external definition because fahr is also declared with extern, but the definition of cels is an inline definition. Because cels has external linkage and is referenced, an external definition has to appear in another translation unit (see 6.9); the inline definition and the external @@ -6946,12 +6945,12 @@ unsigned long long int

EXAMPLE 12 Space can be ''allocated'' from both ends of an array by using a single designator: -

           int a[MAX] = {
                 1, 3, 5, 7, 9, [MAX-5] = 8, 6, 4, 2, 0
           };
 
+

In the above, if MAX is greater than ten, there will be some zero-valued elements in the middle; if it is less than ten, some of the values provided by the first five initializers will be overridden by the second five. @@ -8629,7 +8628,6 @@ unsigned long long int include type qualifiers, unless explicitly stated otherwise.

The standard headers are -

         <assert.h>             <inttypes.h>            <signal.h>              <stdlib.h>
         <complex.h>            <iso646.h>              <stdarg.h>              <string.h>
@@ -8638,6 +8636,7 @@ unsigned long long int
         <fenv.h>               <math.h>                <stdint.h>              <wchar.h>
         <float.h>              <setjmp.h>              <stdio.h>               <wctype.h>
 
+

If a file with the same name as one of the above < and > delimited sequences, not provided as part of the implementation, is placed in any of the standard places that are searched for included source files, the behavior is undefined. @@ -9833,7 +9832,6 @@ unsigned long long int

EXAMPLE -

          #include <fenv.h>
          void f(double x)
@@ -9847,6 +9845,7 @@ unsigned long long int
                /* ... */
          }
 
+

If the function g might depend on status flags set as a side effect of the first x + 1, or if the second x + 1 might depend on control modes set as a side effect of the call to function g, then the program shall contain an appropriately placed invocation of #pragma STDC FENV_ACCESS ON.185) @@ -10235,26 +10234,26 @@ unsigned long long int

The fprintf macros for unsigned integers are: -

         PRIoN           PRIoLEASTN               PRIoFASTN              PRIoMAX             PRIoPTR
         PRIuN           PRIuLEASTN               PRIuFASTN              PRIuMAX             PRIuPTR
         PRIxN           PRIxLEASTN               PRIxFASTN              PRIxMAX             PRIxPTR
         PRIXN           PRIXLEASTN               PRIXFASTN              PRIXMAX             PRIXPTR
 
+

The fscanf macros for signed integers are: -

         SCNdN           SCNdLEASTN               SCNdFASTN              SCNdMAX             SCNdPTR
         SCNiN           SCNiLEASTN               SCNiFASTN              SCNiMAX             SCNiPTR
 
+

The fscanf macros for unsigned integers are: -

         SCNoN           SCNoLEASTN               SCNoFASTN              SCNoMAX             SCNoPTR
         SCNuN           SCNuLEASTN               SCNuFASTN              SCNuMAX             SCNuPTR
         SCNxN           SCNxLEASTN               SCNxFASTN              SCNxMAX             SCNxPTR
 
+

For each type that the implementation provides in <stdint.h>, the corresponding fprintf macros shall be defined and the corresponding fscanf macros shall be defined unless the implementation does not have a suitable fscanf length modifier for @@ -10420,7 +10419,6 @@ unsigned long long int their normal ranges are explained in 7.11.2.1. In the "C" locale, the members shall have the values specified in the comments. -

         char   *decimal_point;                 //   "."
         char   *thousands_sep;                 //   ""
@@ -10447,6 +10445,7 @@ unsigned long long int
         char   int_p_sign_posn;                //   CHAR_MAX
         char   int_n_sign_posn;                //   CHAR_MAX
 
+

The macros defined are NULL (described in 7.17); and

           LC_ALL
@@ -12472,7 +12471,6 @@ unsigned long long int
  compare unequal to the address of any declarable function; and the following, which
  expand to positive integer constant expressions with type int and distinct values that are
  the signal numbers, each corresponding to the specified condition:
-

          SIGABRT abnormal termination, such as is initiated by the abort function
          SIGFPE         an erroneous arithmetic operation, such as zero divide or an operation
@@ -12482,6 +12480,7 @@ unsigned long long int
          SIGSEGV an invalid access to storage
          SIGTERM a termination request sent to the program
 
+

An implementation need not generate any of these signals, except as a result of explicit calls to the raise function. Additional signals and pointers to undeclarable functions, with macro definitions beginning, respectively, with the letters SIG and an uppercase @@ -14444,7 +14443,6 @@ If a length modifier appears with any conversion specifier other than as specifi

EXAMPLE 3 To accept repeatedly from stdin a quantity, a unit of measure, and an item name: -

           #include <stdio.h>
           /* ... */
@@ -14454,6 +14452,7 @@ If a length modifier appears with any conversion specifier other than as specifi
                   fscanf(stdin,"%*[^\n]");
           } while (!feof(stdin) && !ferror(stdin));
 
+

If the stdin stream contains the following lines:

           2 quarts of oil
@@ -16094,10 +16093,10 @@ If a length modifier appears with any conversion specifier other than as specifi
  If s is not a null pointer, the mblen function determines the number of bytes contained
  in the multibyte character pointed to by s. Except that the conversion state of the
  mbtowc function is not affected, it is equivalent to
-

          mbtowc((wchar_t *)0, s, n);
 
+

The implementation shall behave as if no library function calls the mblen function.

Returns

@@ -19668,7 +19667,7 @@ If a length modifier appears with any conversion specifier other than as specifi

The iswpunct function tests for any printing wide character that is one of a locale- specific set of punctuation wide characters for which neither iswspace nor iswalnum - is true.306) + is true.306)

7.25.2.1.10 The iswspace function
Synopsis
@@ -19959,11 +19958,11 @@ If a length modifier appears with any conversion specifier other than as specifi

Annex A

-

                                               (informative)
                                Language syntax summary
 
+

NOTE The notation is described in 6.1. @@ -20052,9 +20051,9 @@ If a length modifier appears with any conversion specifier other than as specifi

(6.4.4.1) integer-constant:
-                decimal-constant integer-suffixopt
-                octal-constant integer-suffixopt
-                hexadecimal-constant integer-suffixopt
+                decimal-constant integer-suffixopt
+                octal-constant integer-suffixopt
+                hexadecimal-constant integer-suffixopt
 
(6.4.4.1) decimal-constant: @@ -20092,10 +20091,10 @@ If a length modifier appears with any conversion specifier other than as specifi
(6.4.4.1) integer-suffix:
-                unsigned-suffix long-suffixopt
+                unsigned-suffix long-suffixopt
                 unsigned-suffix long-long-suffix
-                long-suffix unsigned-suffixopt
-                long-long-suffix unsigned-suffixopt
+                long-suffix unsigned-suffixopt
+                long-long-suffix unsigned-suffixopt
 
(6.4.4.1) unsigned-suffix: one of
@@ -20117,25 +20116,25 @@ If a length modifier appears with any conversion specifier other than as specifi
  (6.4.4.2) decimal-floating-constant:
 
 
-               fractional-constant exponent-partopt floating-suffixopt
-               digit-sequence exponent-part floating-suffixopt
+               fractional-constant exponent-partopt floating-suffixopt
+               digit-sequence exponent-part floating-suffixopt
 
(6.4.4.2) hexadecimal-floating-constant:
                hexadecimal-prefix hexadecimal-fractional-constant
-                             binary-exponent-part floating-suffixopt
+                             binary-exponent-part floating-suffixopt
                hexadecimal-prefix hexadecimal-digit-sequence
-                             binary-exponent-part floating-suffixopt
+                             binary-exponent-part floating-suffixopt
 
(6.4.4.2) fractional-constant:
-                digit-sequenceopt . digit-sequence
+                digit-sequenceopt . digit-sequence
                 digit-sequence .
 
(6.4.4.2) exponent-part:
-               e signopt digit-sequence
-               E signopt digit-sequence
+               e signopt digit-sequence
+               E signopt digit-sequence
 
(6.4.4.2) sign: one of
@@ -20148,14 +20147,14 @@ If a length modifier appears with any conversion specifier other than as specifi
 
(6.4.4.2) hexadecimal-fractional-constant:
-               hexadecimal-digit-sequenceopt .
+               hexadecimal-digit-sequenceopt .
                               hexadecimal-digit-sequence
                hexadecimal-digit-sequence .
 
(6.4.4.2) binary-exponent-part:
-                p signopt digit-sequence
-                P signopt digit-sequence
+                p signopt digit-sequence
+                P signopt digit-sequence
 
(6.4.4.2) hexadecimal-digit-sequence:
@@ -20214,8 +20213,8 @@ If a length modifier appears with any conversion specifier other than as specifi
 

A.1.6 String literals

(6.4.5) string-literal:
-                " s-char-sequenceopt "
-                L" s-char-sequenceopt "
+                " s-char-sequenceopt "
+                L" s-char-sequenceopt "
 
(6.4.5) s-char-sequence:
@@ -20298,7 +20297,7 @@ If a length modifier appears with any conversion specifier other than as specifi
 
                primary-expression
                postfix-expression [ expression ]
-               postfix-expression ( argument-expression-listopt )
+               postfix-expression ( argument-expression-listopt )
                postfix-expression . identifier
                postfix-expression -> identifier
                postfix-expression ++
@@ -20416,14 +20415,14 @@ If a length modifier appears with any conversion specifier other than as specifi
 

A.2.2 Declarations

(6.7) declaration:
-                declaration-specifiers init-declarator-listopt ;
+                declaration-specifiers init-declarator-listopt ;
 
(6.7) declaration-specifiers:
-                storage-class-specifier declaration-specifiersopt
-                type-specifier declaration-specifiersopt
-                type-qualifier declaration-specifiersopt
-                function-specifier declaration-specifiersopt
+                storage-class-specifier declaration-specifiersopt
+                type-specifier declaration-specifiersopt
+                type-qualifier declaration-specifiersopt
+                function-specifier declaration-specifiersopt
 
(6.7) init-declarator-list:
@@ -20463,7 +20462,7 @@ If a length modifier appears with any conversion specifier other than as specifi
 
(6.7.2.1) struct-or-union-specifier:
-                struct-or-union identifieropt { struct-declaration-list }
+                struct-or-union identifieropt { struct-declaration-list }
                 struct-or-union identifier
 
(6.7.2.1) struct-or-union: @@ -20482,8 +20481,8 @@ If a length modifier appears with any conversion specifier other than as specifi
(6.7.2.1) specifier-qualifier-list:
-                type-specifier specifier-qualifier-listopt
-                type-qualifier specifier-qualifier-listopt
+                type-specifier specifier-qualifier-listopt
+                type-qualifier specifier-qualifier-listopt
 
(6.7.2.1) struct-declarator-list:
@@ -20494,12 +20493,12 @@ If a length modifier appears with any conversion specifier other than as specifi
 
 
                 declarator
-                declaratoropt : constant-expression
+                declaratoropt : constant-expression
 
(6.7.2.2) enum-specifier:
-               enum identifieropt { enumerator-list }
-               enum identifieropt { enumerator-list , }
+               enum identifieropt { enumerator-list }
+               enum identifieropt { enumerator-list , }
                enum identifier
 
(6.7.2.2) enumerator-list: @@ -20524,23 +20523,23 @@ If a length modifier appears with any conversion specifier other than as specifi
(6.7.5) declarator:
-               pointeropt direct-declarator
+               pointeropt direct-declarator
 
(6.7.5) direct-declarator:
                 identifier
                 ( declarator )
-                direct-declarator [ type-qualifier-listopt assignment-expressionopt ]
-                direct-declarator [ static type-qualifier-listopt assignment-expression ]
+                direct-declarator [ type-qualifier-listopt assignment-expressionopt ]
+                direct-declarator [ static type-qualifier-listopt assignment-expression ]
                 direct-declarator [ type-qualifier-list static assignment-expression ]
-                direct-declarator [ type-qualifier-listopt * ]
+                direct-declarator [ type-qualifier-listopt * ]
                 direct-declarator ( parameter-type-list )
-                direct-declarator ( identifier-listopt )
+                direct-declarator ( identifier-listopt )
 
(6.7.5) pointer:
-                * type-qualifier-listopt
-                * type-qualifier-listopt pointer
+                * type-qualifier-listopt
+                * type-qualifier-listopt pointer
 
(6.7.5) type-qualifier-list:
@@ -20561,7 +20560,7 @@ If a length modifier appears with any conversion specifier other than as specifi
  (6.7.5) parameter-declaration:
 
               declaration-specifiers declarator
-              declaration-specifiers abstract-declaratoropt
+              declaration-specifiers abstract-declaratoropt
 
(6.7.5) identifier-list:
@@ -20570,24 +20569,24 @@ If a length modifier appears with any conversion specifier other than as specifi
 
(6.7.6) type-name:
-               specifier-qualifier-list abstract-declaratoropt
+               specifier-qualifier-list abstract-declaratoropt
 
(6.7.6) abstract-declarator:
                pointer
-               pointeropt direct-abstract-declarator
+               pointeropt direct-abstract-declarator
 
(6.7.6) direct-abstract-declarator:
                 ( abstract-declarator )
-                direct-abstract-declaratoropt [ type-qualifier-listopt
-                               assignment-expressionopt ]
-                direct-abstract-declaratoropt [ static type-qualifier-listopt
+                direct-abstract-declaratoropt [ type-qualifier-listopt
+                               assignment-expressionopt ]
+                direct-abstract-declaratoropt [ static type-qualifier-listopt
                                assignment-expression ]
-                direct-abstract-declaratoropt [ type-qualifier-list static
+                direct-abstract-declaratoropt [ type-qualifier-list static
                                assignment-expression ]
-                direct-abstract-declaratoropt [ * ]
-                direct-abstract-declaratoropt ( parameter-type-listopt )
+                direct-abstract-declaratoropt [ * ]
+                direct-abstract-declaratoropt ( parameter-type-listopt )
 
(6.7.7) typedef-name:
@@ -20601,8 +20600,8 @@ If a length modifier appears with any conversion specifier other than as specifi
 
(6.7.8) initializer-list:
-                 designationopt initializer
-                 initializer-list , designationopt initializer
+                 designationopt initializer
+                 initializer-list , designationopt initializer
 
(6.7.8) designation: @@ -20638,7 +20637,7 @@ If a length modifier appears with any conversion specifier other than as specifi
(6.8.2) compound-statement:
-              { block-item-listopt }
+              { block-item-listopt }
 
(6.8.2) block-item-list:
@@ -20652,7 +20651,7 @@ If a length modifier appears with any conversion specifier other than as specifi
 
(6.8.3) expression-statement:
-               expressionopt ;
+               expressionopt ;
 
(6.8.4) selection-statement: @@ -20665,15 +20664,15 @@ If a length modifier appears with any conversion specifier other than as specifi
                  while ( expression ) statement
                  do statement while ( expression ) ;
-                 for ( expressionopt ; expressionopt ; expressionopt ) statement
-                 for ( declaration expressionopt ; expressionopt ) statement
+                 for ( expressionopt ; expressionopt ; expressionopt ) statement
+                 for ( declaration expressionopt ; expressionopt ) statement
 
(6.8.6) jump-statement:
                goto identifier ;
                continue ;
                break ;
-               return expressionopt ;
+               return expressionopt ;
 

A.2.4 External definitions

@@ -20689,7 +20688,7 @@ If a length modifier appears with any conversion specifier other than as specifi
(6.9.1) function-definition:
-                declaration-specifiers declarator declaration-listopt compound-statement
+                declaration-specifiers declarator declaration-listopt compound-statement
 
(6.9.1) declaration-list:
@@ -20700,7 +20699,7 @@ If a length modifier appears with any conversion specifier other than as specifi
 

A.3 Preprocessing directives

(6.10) preprocessing-file:
-               groupopt
+               groupopt
 
(6.10) group:
@@ -20717,13 +20716,13 @@ If a length modifier appears with any conversion specifier other than as specifi
  (6.10) if-section:
 
 
-                 if-group elif-groupsopt else-groupopt endif-line
+                 if-group elif-groupsopt else-groupopt endif-line
 
(6.10) if-group:
-                # if     constant-expression new-line groupopt
-                # ifdef identifier new-line groupopt
-                # ifndef identifier new-line groupopt
+                # if     constant-expression new-line groupopt
+                # ifdef identifier new-line groupopt
+                # ifndef identifier new-line groupopt
 
(6.10) elif-groups:
@@ -20732,11 +20731,11 @@ If a length modifier appears with any conversion specifier other than as specifi
 
(6.10) elif-group:
-                # elif        constant-expression new-line groupopt
+                # elif        constant-expression new-line groupopt
 
(6.10) else-group:
-                # else        new-line groupopt
+                # else        new-line groupopt
 
(6.10) endif-line:
@@ -20746,20 +20745,20 @@ If a length modifier appears with any conversion specifier other than as specifi
 
                # include pp-tokens new-line
                # define identifier replacement-list new-line
-               # define identifier lparen identifier-listopt )
+               # define identifier lparen identifier-listopt )
                                                replacement-list new-line
                # define identifier lparen ... ) replacement-list new-line
                # define identifier lparen identifier-list , ... )
                                                replacement-list new-line
                # undef   identifier new-line
                # line    pp-tokens new-line
-               # error   pp-tokensopt new-line
-               # pragma pp-tokensopt new-line
+               # error   pp-tokensopt new-line
+               # pragma pp-tokensopt new-line
                #         new-line
 
(6.10) text-line:
-                pp-tokensopt new-line
+                pp-tokensopt new-line
 
(6.10) non-directive:
@@ -20772,7 +20771,7 @@ If a length modifier appears with any conversion specifier other than as specifi
  (6.10) replacement-list:
 
 
-               pp-tokensopt
+               pp-tokensopt
 
(6.10) pp-tokens:
@@ -21594,11 +21593,11 @@ If a length modifier appears with any conversion specifier other than as specifi
 

Annex C

-

                                      (informative)
                                    Sequence points
 
+

The following are the sequence points described in 5.1.2.3:

  • The call to a function, after the arguments have been evaluated (6.5.2.2). @@ -21620,11 +21619,11 @@ If a length modifier appears with any conversion specifier other than as specifi

Annex D

-

                                      (normative)
                 Universal character names for identifiers
 
+

This clause lists the hexadecimal code values that are valid in universal character names in identifiers.

@@ -21727,16 +21726,15 @@ If a length modifier appears with any conversion specifier other than as specifi

Annex E

-

                                     (informative)
-
Implementation limits
+ Implementation limits
+

The contents of the header <limits.h> are given below, in alphabetical order. The minimum magnitudes shown shall be replaced by implementation-defined magnitudes with the same sign. The values shall all be constant expressions suitable for use in #if preprocessing directives. The components are described further in 5.2.4.2.1. -

         #define     CHAR_BIT                               8
         #define     CHAR_MAX          UCHAR_MAX or SCHAR_MAX
@@ -21758,6 +21756,7 @@ If a length modifier appears with any conversion specifier other than as specifi
         #define     ULONG_MAX                     4294967295
         #define     ULLONG_MAX          18446744073709551615
 
+

The contents of the header <float.h> are given below. All integer values, except FLT_ROUNDS, shall be constant expressions suitable for use in #if preprocessing directives; all floating values shall be constant expressions. The components are @@ -21765,16 +21764,15 @@ If a length modifier appears with any conversion specifier other than as specifi

The values given in the following list shall be replaced by implementation-defined expressions: -

         #define FLT_EVAL_METHOD
         #define FLT_ROUNDS
 
+

The values given in the following list shall be replaced by implementation-defined constant expressions that are greater or equal in magnitude (absolute value) to those shown, with the same sign: -

         #define    DBL_DIG                                        10
         #define    DBL_MANT_DIG
@@ -21797,14 +21795,15 @@ If a length modifier appears with any conversion specifier other than as specifi
         #define    LDBL_MIN_10_EXP                              -37
         #define    LDBL_MIN_EXP
 
+

The values given in the following list shall be replaced by implementation-defined constant expressions with values that are greater than or equal to those shown: -

         #define DBL_MAX                                      1E+37
         #define FLT_MAX                                      1E+37
         #define LDBL_MAX                                     1E+37
 
+

The values given in the following list shall be replaced by implementation-defined constant expressions with (positive) values that are less than or equal to those shown: @@ -22081,7 +22080,6 @@ If a length modifier appears with any conversion specifier other than as specifi is ''on'').315)

EXAMPLE -

           #include <fenv.h>
           #pragma STDC FENV_ACCESS ON
@@ -22094,6 +22092,7 @@ If a length modifier appears with any conversion specifier other than as specifi
                 /* ... */
           }
 
+

For the static initialization, the division is done at translation time, raising no (execution-time) floating- point exceptions. On the other hand, for the three automatic initializations the invalid division occurs at @@ -22122,7 +22121,6 @@ If a length modifier appears with any conversion specifier other than as specifi time.

EXAMPLE -

           #include <fenv.h>
           #pragma STDC FENV_ACCESS ON
@@ -22137,6 +22135,7 @@ If a length modifier appears with any conversion specifier other than as specifi
                 /* ... */
           }
 
+

The static initialization of v raises no (execution-time) floating-point exceptions because its computation is done at translation time. The automatic initialization of u and w require an execution-time conversion to float of the wider value 1.1e75, which raises floating-point exceptions. The automatic initializations @@ -23098,10 +23097,10 @@ If a length modifier appears with any conversion specifier other than as specifi iy i(yu) -yv (-yv) + i(yu)

-

         x + iy       (xu) + i(yu)        (-yv) + i(xv)
 
+

If the second operand is not complex, then the result and floating-point exception behavior of the / operator is defined by the usual mathematical formula:

@@ -23116,10 +23115,10 @@ If a length modifier appears with any conversion specifier other than as specifi
         iy               i(y/u)                     y/v
 
-

         x + iy       (x/u) + i(y/u)        (y/v) + i(-x/v)
 
+

The * and / operators satisfy the following infinity properties for all real, imaginary, and complex operands:325)

    @@ -23145,7 +23144,6 @@ If a length modifier appears with any conversion specifier other than as specifi EXAMPLE 1 Multiplication of double _Complex operands could be implemented as follows. Note that the imaginary unit I has imaginary type (see G.6). -

             #include <math.h>
             #include <complex.h>
    @@ -23195,13 +23193,13 @@ If a length modifier appears with any conversion specifier other than as specifi
                       return x + I * y;
               }
     
    +

    This implementation achieves the required treatment of infinities at the cost of only one isnan test in ordinary (finite) cases. It is less than ideal in that undue overflow and underflow may occur.

    EXAMPLE 2 Division of two double _Complex operands could be implemented as follows. -

               #include <math.h>
               #include <complex.h>
    @@ -23247,6 +23245,7 @@ If a length modifier appears with any conversion specifier other than as specifi
                       return x + I * y;
              }
     
    +

    Scaling the denominator alleviates the main overflow and underflow problem, which is more serious than for multiplication. In the spirit of the multiplication example above, this code does not defend against overflow and underflow in the calculation of the numerator. Scaling with the scalbn function, instead of @@ -23323,14 +23322,13 @@ If a length modifier appears with any conversion specifier other than as specifi

    Each of the functions cabs and carg is specified by a formula in terms of a real function (whose special cases are covered in annex F): -

              cabs(x + iy) = hypot(x, y)
              carg(x + iy) = atan2(y, x)
     
    +

    Each of the functions casin, catan, ccos, csin, and ctan is specified implicitly by a formula in terms of other complex functions (whose special cases are specified below): -

              casin(z)        =   -i casinh(iz)
              catan(z)        =   -i catanh(iz)
    @@ -23338,6 +23336,7 @@ If a length modifier appears with any conversion specifier other than as specifi
              csin(z)         =   -i csinh(iz)
              ctan(z)         =   -i ctanh(iz)
     
    +

    For the other functions, the following subclauses specify behavior for special cases, including treatment of the ''invalid'' and ''divide-by-zero'' floating-point exceptions. For families of functions, the specifications apply to all of the functions even though only the @@ -23862,11 +23861,11 @@ If a length modifier appears with any conversion specifier other than as specifi

    Annex I

    -

                                          (informative)
                                     Common warnings
     
    +

    An implementation may generate warnings in many situations, none of which are specified as part of this International Standard. The following are a few of the more common situations. @@ -23907,11 +23906,11 @@ If a length modifier appears with any conversion specifier other than as specifi

Annex J

-

                                       (informative)
                                    Portability issues
 
+

This annex collects some information about portability that appears in this International Standard. -- 2.20.1