| <?xml version="1.0" encoding="UTF-8"?> | 
 | <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook MathML Module V1.1b1//EN" | 
 |               "http://www.oasis-open.org/docbook/xml/mathml/1.1CR1/dbmathml.dtd"> | 
 |  | 
 | <refentry> | 
 |     <refentryinfo> | 
 |         <keywordset> | 
 |             <keyword>printf Function</keyword> | 
 |         </keywordset> | 
 |     </refentryinfo> | 
 |  | 
 |     <refmeta> | 
 |         <refentrytitle> | 
 |             printf Function | 
 |         </refentrytitle> | 
 |  | 
 |         <refmiscinfo> | 
 |             <copyright> | 
 |                 <year>2007-2013</year> | 
 |                 <holder>The Khronos Group Inc. | 
 |  Permission is hereby granted, free of charge, to any person obtaining a | 
 | copy of this software and/or associated documentation files (the | 
 | "Materials"), to deal in the Materials without restriction, including | 
 | without limitation the rights to use, copy, modify, merge, publish, | 
 | distribute, sublicense, and/or sell copies of the Materials, and to | 
 | permit persons to whom the Materials are furnished to do so, subject to | 
 | the condition that this copyright notice and permission notice shall be included | 
 | in all copies or substantial portions of the Materials.</holder> | 
 |             </copyright> | 
 |         </refmiscinfo> | 
 |         <manvolnum>3</manvolnum> | 
 |  | 
 |     </refmeta> | 
 |  | 
 | <!-- ================================ SYNOPSIS --> | 
 |  | 
 |     <refnamediv id="printfFunction"> | 
 |         <refname> | 
 |             printf Function | 
 |         </refname> | 
 |  | 
 |         <refpurpose> | 
 |             The OpenCL C programming language implements the <function>printf</function> function. | 
 |         </refpurpose> | 
 |     </refnamediv> | 
 |  | 
 |     <refsynopsisdiv xmlns:xlink="http://www.w3.org/1999/xlink"><title></title> | 
 |         <funcsynopsis> | 
 |             <funcprototype> | 
 |                 <funcdef> | 
 |                     <link xlink:href="scalarDataTypes.html">int</link> | 
 |  <function>printf</function> | 
 |                 </funcdef> | 
 |                     <paramdef>constant | 
 |                     <link xlink:href="scalarDataTypes.html">char</link> | 
 |                     * restrict<parameter>format</parameter>, ... | 
 |                 </paramdef> | 
 |             </funcprototype> | 
 |         </funcsynopsis> | 
 |     </refsynopsisdiv> | 
 |  | 
 | <!-- ================================ PARAMETERS --> | 
 |  | 
 | <!-- ================================ DESCRIPTION  --> | 
 |  | 
 |     <refsect1 id="description"><title>Description</title> | 
 |         <para> | 
 |             The <function>printf</function> built-in function writes output to | 
 |             an implementation-defined stream such as stdout under control of the | 
 |             string pointed to by <varname>format</varname> that specifies how | 
 |             subsequent arguments are converted for output. If there are insufficient | 
 |             arguments for the format, the behavior is undefined. If the format is | 
 |             exhausted while arguments remain, the excess arguments are evaluated | 
 |             (as always) but are otherwise ignored. The <function>printf</function> | 
 |             function returns when the end of the format string is encountered. | 
 |         </para> | 
 |     </refsect1> | 
 |  | 
 | <!-- ================================ NOTES  --> | 
 |  | 
 |     <refsect1 id="notes"><title>Notes</title> | 
 |         <para> | 
 |             <function>printf</function> returns 0 if it was executed successfully | 
 |             and -1 otherwise. | 
 |         </para> | 
 |  | 
 |         <bridgehead><function>printf</function> output synchronization</bridgehead> | 
 |  | 
 |         <para> | 
 |           When the event that is associated with a particular kernel invocation is completed, | 
 |           the output of all <function>printf</function>() calls executed by this kernel | 
 |           invocation is flushed to the implementation-defined output stream.  Calling | 
 |           <citerefentry><refentrytitle>clFinish</refentrytitle></citerefentry> on a command | 
 |           queue flushes all pending output by <function>printf</function> in previously enqueued | 
 |           and completed commands to the implementation-defined output stream. In the case that | 
 |           <function>printf</function> is executed from multiple work-items concurrently, there | 
 |           is no guarantee of ordering with respect to written data.  For example, it is valid | 
 |           for the output of a work-item with a global id (0,0,1) to appear intermixed with the | 
 |           output of a work-item with a global id (0,0,4) and so on. | 
 |         </para> | 
 |  | 
 |         <bridgehead><function>printf</function> format string</bridgehead> | 
 |  | 
 |         <para> | 
 |           The format shall be a character sequence, beginning and ending in its initial shift | 
 |           state. The format is composed of zero or more directives: ordinary characters (not | 
 |           %), which are copied unchanged to the output stream; and conversion specifications, | 
 |           each of which results in fetching zero or more subsequent arguments, converting them, | 
 |           if applicable, according to the corresponding conversion specifier, and then writing | 
 |           the result to the output stream. As format is in the constant address space it must | 
 |           be resolvable at compile time and thus cannot be dynamically created by the executing | 
 |           program, itself. | 
 |         </para> | 
 |  | 
 |         <para> | 
 |           Each conversion specification is introduced by the character %. After the %, the | 
 |           following appear in sequence: | 
 |         </para> | 
 |  | 
 |         <itemizedlist mark="disc"> | 
 |             <listitem> | 
 |                 Zero or more <varname>flags</varname> (in any order) that modify the meaning | 
 |                 of the conversion specification. | 
 |             </listitem> | 
 |  | 
 |             <listitem> | 
 |                 An optional minimum <varname>field width</varname>. If the converted value has | 
 |                 fewer characters than the field width, it is padded with spaces (by default) | 
 |                 on the left (or right, if the left adjustment flag, described later, has been | 
 |                 given) to the field width. The field width takes the form of a nonnegative decimal | 
 |                 integer.) Note that 0 is taken as a flag, not as the beginning of a field width. | 
 |             </listitem> | 
 |  | 
 |             <listitem> | 
 |                 An optional <varname>precision</varname> that gives the minimum number of digits | 
 |                 to appear for the d, i, o, u, x, and X conversions, the number of digits to | 
 |                 appear after the decimal point character for a, A, e, E, f, and F conversions, | 
 |                 the maximum number of significant digits for the g and G conversions, or the | 
 |                 maximum number of bytes to be written for s conversions. The precision takes | 
 |                 the form of a period (.) followed by an optional decimal integer; if only the | 
 |                 period is specified, the precision is taken as zero. If a precision appears | 
 |                 with any other conversion specifier, the behavior is undefined. | 
 |             </listitem> | 
 |  | 
 |             <listitem> | 
 |                 An optional <varname>vector specifier</varname>. | 
 |             </listitem> | 
 |  | 
 |             <listitem> | 
 |               A <varname>length modifier</varname> that specifies the size of the argument. The | 
 |               <varname>length modifier</varname> is required with a vector specifier and together | 
 |               specifies the vector type. Implicit conversions between vector types are disallowed | 
 |               (as per section 6.2.1). If the <varname>vector specifier</varname> is not specified, | 
 |               the <varname>length modifier</varname> is optional. | 
 |             </listitem> | 
 |  | 
 |             <listitem> | 
 |                 A <varname>conversion specifier</varname> character that specifies the type of | 
 |                 conversion to be applied. | 
 |             </listitem> | 
 |         </itemizedlist> | 
 |  | 
 |         <para> | 
 |             The flag characters and their meanings are: | 
 |         </para> | 
 |  | 
 |         <informaltable frame="all"> | 
 |             <tgroup cols="2" align="left" colsep="1" rowsep="1"> | 
 |                 <colspec colname="col1" colnum="1" /> <colspec colname="col2" colnum="2" /> | 
 |                 <tbody> | 
 |                     <row> | 
 |                         <entry><emphasis>-</emphasis></entry> | 
 |                         <entry> | 
 |                             The result of the conversion is left-justified within the field. (It | 
 |                             is right-justified if this flag is not specified.) | 
 |                         </entry> | 
 |                     </row> | 
 |  | 
 |                     <row> | 
 |                         <entry><emphasis>+</emphasis></entry> | 
 |                         <entry> | 
 |                             The result of a signed conversion always begins with a plus or | 
 |                             minus sign. (It begins with a sign only when a negative value | 
 |                             is converted if this flag is not specified.) The results of all | 
 |                             floating conversions of a negative zero, and of negative values | 
 |                             that round to zero, include a minus sign. | 
 |                         </entry> | 
 |                     </row> | 
 |  | 
 |                     <row> | 
 |                         <entry><emphasis>space</emphasis></entry> | 
 |                         <entry> | 
 |                           If the first character of a signed conversion is not a sign, or if | 
 |                           a signed conversion results in no characters, a space is prefixed to | 
 |                           the result. If the <emphasis>space</emphasis> and + flags both appear, | 
 |                           the <varname>space</varname> flag is ignored. | 
 |                         </entry> | 
 |                     </row> | 
 |  | 
 |                     <row> | 
 |                         <entry><emphasis>#</emphasis></entry> | 
 |                         <entry> | 
 |                             The result is converted to an "alternative form". For <emphasis>o</emphasis> conversion, | 
 |                             it increases the precision, if and only if necessary, to force the | 
 |                             first digit of the result to be a zero (if the value and precision | 
 |                             are both 0, a single 0 is printed). For x (or X) conversion, a | 
 |                             nonzero result has 0x (or 0X) prefixed to it. For a, A, e, E, f, | 
 |                             F, g, and G conversions, the result of converting a floating-point | 
 |                             number always contains a decimal-point character, even if no digits | 
 |                             follow it. (Normally, a decimal-point character appears in the | 
 |                             result of these conversions only if a digit follows it.) For g and | 
 |                             G conversions, trailing zeros are not removed from the result. For | 
 |                             other conversions, the behavior is undefined. | 
 |                         </entry> | 
 |                     </row> | 
 |  | 
 |                     <row> | 
 |                         <entry><emphasis>0</emphasis></entry> | 
 |                         <entry> | 
 |                             For d, i, o, u, x, X, a, A, e, E, f, F, g, and G conversions, leading | 
 |                             zeros (following any indication of sign or base) are used to pad to | 
 |                             the field width rather than performing space padding, except when | 
 |                             converting an infinity or NaN.  If the <emphasis>0</emphasis> and | 
 |                             <emphasis>-</emphasis> flags both appear, the 0 flag is ignored. For | 
 |                             d, i, o, u, x, and X conversions, if a precision is specified, the | 
 |                             0 flag is ignored.  For other conversions, the behavior is undefined. | 
 |                         </entry> | 
 |                     </row> | 
 |                 </tbody> | 
 |             </tgroup> | 
 |         </informaltable> | 
 |  | 
 |         <para> | 
 |             The vector specifier and its meaning is: | 
 |         </para> | 
 |         <informaltable frame="all"> | 
 |             <tgroup cols="2" align="left" colsep="1" rowsep="1"> | 
 |                 <colspec colname="col1" colnum="1" /> | 
 |                 <colspec colname="col2" colnum="2" /> | 
 |                 <tbody> | 
 |                     <row> | 
 |                         <entry>v<replaceable>n</replaceable></entry> | 
 |                         <entry> | 
 |                             Specifies that a following a, A, e, E, f, F, g, G, d, i, o, u, | 
 |                             x, or X conversion specifier applies to a vector argument, where | 
 |                             <replaceable>n</replaceable> is the size of the vector and must be 2, | 
 |                             3, 4, 8 or 16.  The vector value is displayed in the following general | 
 |                             form: | 
 |  | 
 |                             <para> value1 C value2 C ... C value<replaceable>n</replaceable> </para> | 
 |  | 
 |                             <para> | 
 |                               where C is a separator character. The value for this separator | 
 |                               character is a comma. | 
 |                             </para> | 
 |                         </entry> | 
 |                     </row> | 
 |                 </tbody> | 
 |             </tgroup> | 
 |         </informaltable> | 
 |  | 
 |         <para> | 
 |           If the vector specifier is not used, the length modifiers and their meanings are: | 
 |         </para> | 
 |  | 
 |         <informaltable frame="all"> | 
 |             <tgroup cols="2" align="left" colsep="1" rowsep="1"> | 
 |                 <colspec colname="col1" colnum="1" /> | 
 |                 <colspec colname="col2" colnum="2" /> | 
 |                 <tbody> | 
 |                     <row> | 
 |                         <entry>hh</entry> | 
 |                         <entry> | 
 |                             Specifies that a following d, i, o, u, x, or X conversion specifier | 
 |                             applies to a char or uchar argument (the argument will have been promoted | 
 |                             according to the integer promotions, but its value shall be converted to | 
 |                             <type>char</type> or <type>uchar</type> before printing). | 
 |                         </entry> | 
 |                     </row> | 
 |  | 
 |                     <row> | 
 |                         <entry>h</entry> | 
 |                         <entry> | 
 |                             Specifies that a following d, i, o, u, x, or X conversion specifier | 
 |                             applies to a <type>short</type> or <type>ushort</type> argument (the | 
 |                             argument will have been promoted according to the integer promotions, | 
 |                             but its value shall be converted to <type>short</type> or <type>unsigned | 
 |                             short</type> before printing). | 
 |                         </entry> | 
 |                     </row> | 
 |  | 
 |                     <row> | 
 |                         <entry>l (ell)</entry> | 
 |                         <entry> | 
 |                           Specifies that a following d, i, o, u, x, or X conversion specifier | 
 |                           applies to a long or ulong argument. The l modifier is supported | 
 |                           by the full profile. For the embedded profile, the l modifier is | 
 |                           supported only if 64-bit integers are supported by the device. | 
 |                         </entry> | 
 |                     </row> | 
 |                 </tbody> | 
 |             </tgroup> | 
 |         </informaltable> | 
 |  | 
 |         <para> | 
 | If the vector specifier is used, the length modifiers and their meanings are: | 
 |         </para> | 
 |  | 
 |         <informaltable frame="all"> | 
 |             <tgroup cols="2" align="left" colsep="1" rowsep="1"> | 
 |                 <colspec colname="col1" colnum="1" /> | 
 |                 <colspec colname="col2" colnum="2" /> | 
 |                 <tbody> | 
 |                     <row> | 
 |                         <entry>hh</entry> | 
 |                         <entry> | 
 |                           Specifies that a following d, i, o, u, x, or X conversion | 
 |                           specifier applies to a char<replaceable>n</replaceable> or | 
 |                           uchar<replaceable>n</replaceable> argument (the argument will not | 
 |                           be promoted). | 
 |                         </entry> | 
 |                     </row> | 
 |  | 
 |                     <row> | 
 |                         <entry>h</entry> | 
 |                         <entry> | 
 |                           Specifies that a following d, i, o, u, x, or X conversion | 
 |                           specifier applies to a short<replaceable>n</replaceable> or | 
 |                           ushort<replaceable>n</replaceable> argument (the argument will not | 
 |                           be promoted); that a following a, A, e, E, f, F, g, or G conversion | 
 |                           specifier applies to a half<replaceable>n</replaceable> argument if the | 
 |                           <citerefentry><refentrytitle>cl_khr_fp16</refentrytitle></citerefentry> | 
 |                           extension is supported. | 
 |                         </entry> | 
 |                     </row> | 
 |  | 
 |                     <row> | 
 |                         <entry>hl</entry> | 
 |                         <entry> | 
 |                           This modifier can only be used with the vector specifier.  Specifies | 
 |                           that a following d, i, o, u, x, or X conversion specifier applies to a | 
 |                           int<replaceable>n</replaceable> or uint<replaceable>n</replaceable> | 
 |                           argument; that a following a, A, e, E, f, F, g, or G conversion | 
 |                           specifier applies to a float<replaceable>n</replaceable> argument. | 
 |                         </entry> | 
 |                     </row> | 
 |  | 
 |                     <row> | 
 |                         <entry>l (ell)</entry> | 
 |                         <entry> | 
 |                           Specifies that a following d, i, o, u, x, or X conversion | 
 |                           specifier applies to a long<replaceable>n</replaceable> or | 
 |                           ulong<replaceable>n</replaceable> argument; that a following | 
 |                           a, A, e, E, f, F, g, or G conversion specifier applies to | 
 |                           a double<replaceable>n</replaceable> argument. The l modifier | 
 |                           is supported by the full profile. For the embedded profile, the l | 
 |                           modifier is supported only if 64-bit integers or double-precision | 
 |                           floating-point are supported by the device. | 
 |                         </entry> | 
 |                     </row> | 
 |                 </tbody> | 
 |             </tgroup> | 
 |         </informaltable> | 
 |  | 
 |         <para> | 
 |           If a vector specifier appears without a length modifier, the behavior is undefined. | 
 |           The vector data type described by the vector specifier and length modifier must match | 
 |           the data type of the argument; otherwise the behavior is undefined. | 
 |         </para> | 
 |  | 
 |         <para> | 
 |           If a length modifier appears with any conversion specifier other than as specified | 
 |           above, the behavior is undefined | 
 |         </para> | 
 |  | 
 |         <para> | 
 |           The conversion specifiers and their meanings are: | 
 |         </para> | 
 |  | 
 |         <informaltable frame="all"> | 
 |             <tgroup cols="2" align="left" colsep="1" rowsep="1"> | 
 |                 <colspec colname="col1" colnum="1" /> | 
 |                 <colspec colname="col2" colnum="2" /> | 
 |                 <tbody> | 
 |                     <row> | 
 |                         <entry>d,i</entry> | 
 |                         <entry> | 
 |                           The int, char<replaceable>n</replaceable>, | 
 |                           short<replaceable>n</replaceable>, int<replaceable>n</replaceable> | 
 |                           or long<replaceable>n</replaceable> argument is converted to signed | 
 |                           decimal in the style <emphasis>[−]dddd</emphasis>. The precision | 
 |                           specifies the minimum number of digits to appear; if the value being | 
 |                           converted can be represented in fewer digits, it is expanded with | 
 |                           leading zeros. The default precision is 1. The result of converting | 
 |                           a zero value with a precision of zero is no characters. | 
 |                         </entry> | 
 |                     </row> | 
 |  | 
 |                     <row> | 
 |                         <entry>o,u,x,X</entry> | 
 |                         <entry> | 
 |                           The unsigned int, uchar<replaceable>n</replaceable>, | 
 |                           ushort<replaceable>n</replaceable>, uint<replaceable>n</replaceable> | 
 |                           or ulong<replaceable>n</replaceable> argument is converted to unsigned | 
 |                           octal (o), unsigned decimal (u), or unsigned hexadecimal notation (x | 
 |                           or X) in the style <emphasis>dddd</emphasis>; the letters abcdef are | 
 |                           used for x conversion and the letters ABCDEF for X conversion. The | 
 |                           precision specifies the minimum number of digits to appear; if the | 
 |                           value being converted can be represented in fewer digits, it is | 
 |                           expanded with leading zeros. The default precision is 1. The result | 
 |                           of converting a zero value with a precision of zero is no characters. | 
 |                         </entry> | 
 |                     </row> | 
 |  | 
 |                     <row> | 
 |                         <entry>f,F</entry> | 
 |                         <entry> | 
 |                           A double, half<replaceable>n</replaceable>, | 
 |                           float<replaceable>n</replaceable> or double<replaceable>n</replaceable> | 
 |                           argument representing a floating-point number is converted to decimal | 
 |                           notation in the style <replaceable>[−]ddd.ddd</replaceable>, | 
 |                           where the number of digits after the decimal-point character is | 
 |                           equal to the precision specification. If the precision is missing, | 
 |                           it is taken as 6; if the precision is zero and the # flag is not | 
 |                           specified, no decimal-point character appears. If a decimal-point | 
 |                           character appears, at least one digit appears before it. The | 
 |                           value is rounded to the appropriate number of digits. A double, | 
 |                           half<replaceable>n</replaceable>, float<replaceable>n</replaceable> | 
 |                           or double<replaceable>n</replaceable> argument representing an infinity | 
 |                           is converted in one of the styles [-]inf or [-]infinity — which style | 
 |                           is implementation-defined. A double, half<replaceable>n</replaceable>, | 
 |                           float<replaceable>n</replaceable> or double<replaceable>n</replaceable> | 
 |                           argument representing a NaN is converted in one of the styles [- | 
 |                           ]nan or [-]nan(<replaceable>n-char-sequence</replaceable>) — which style, and the meaning | 
 |                           of any n-charsequence, is implementation-defined. The F conversion | 
 |                           specifier produces INF, INFINITY, or NAN instead of inf, infinity, or | 
 |                           nan, respectively.  When applied to infinite and NaN values, the -, | 
 |                           +, and <replaceable>space</replaceable> flag characters have their | 
 |                           usual meaning; the # and 0 flag characters have no effect. | 
 |                         </entry> | 
 |                     </row> | 
 |  | 
 |                     <row> | 
 |                         <entry>e,E</entry> | 
 |                         <entry> | 
 |                           A double, half<replaceable>n</replaceable>, | 
 |                           float<replaceable>n</replaceable> or double<replaceable>n</replaceable> | 
 |                           argument representing a floating-point number is converted in the style | 
 |                           <replaceable>[−]d.ddd</replaceable> e±<replaceable>dd</replaceable>, | 
 |                           where there is one digit (which is nonzero if the argument is nonzero) | 
 |                           before the decimal-point character and the number of digits after it is | 
 |                           equal to the precision; if the precision is missing, it is taken as 6; if | 
 |                           the precision is zero and the # flag is not specified, no decimal-point | 
 |                           character appears. The value is rounded to the appropriate number of | 
 |                           digits. The E conversion specifier produces a number with E instead | 
 |                           of e introducing the exponent. The exponent always contains at least | 
 |                           two digits, and only as many more digits as necessary to represent | 
 |                           the exponent. If the value is zero, the exponent is zero. A double, | 
 |                           half<replaceable>n</replaceable>, float<replaceable>n</replaceable> | 
 |                           or double<replaceable>n</replaceable> argument representing an infinity | 
 |                           or NaN is converted in the style of an f or F conversion specifier | 
 |                         </entry> | 
 |                     </row> | 
 |  | 
 |                     <row> | 
 |                         <entry>g,G</entry> | 
 |                         <entry> | 
 |                           A double, half<replaceable>n</replaceable>, | 
 |                           float<replaceable>n</replaceable> or double<replaceable>n</replaceable> | 
 |                           argument representing a floating-point number is converted in | 
 |                           style f or e (or in style F or E in the case of a G conversion | 
 |                           specifier), depending on the value converted and the precision. Let | 
 |                           <replaceable>P</replaceable> equal the precision if nonzero, 6 if | 
 |                           the precision is omitted, or 1 if the precision is zero.  Then, if a | 
 |                           conversion with style E would have an exponent of <varname>X</varname>: | 
 |                           — if <varname>P</varname> > <varname>X</varname> ≥ −4, the | 
 |                           conversion is with style f (or F) and precision <varname>P</varname> | 
 |                           − (<varname>X</varname> + 1). — otherwise, the conversion is with | 
 |                           style e (or E) and precision <varname>P</varname> − 1.  Finally, | 
 |                           unless the # flag is used, any trailing zeros are removed from the | 
 |                           fractional portion of the result and the decimal-point character | 
 |                           is removed if there is no fractional portion remaining.  A double, | 
 |                           half<replaceable>n</replaceable>, float<replaceable>n</replaceable> or | 
 |                           double<replaceable>n</replaceable> e argument representing an infinity | 
 |                           or NaN is converted in the style of an f or F conversion specifier. | 
 |                         </entry> | 
 |                     </row> | 
 |  | 
 |                     <row> | 
 |                         <entry>a,A</entry> | 
 |                         <entry> | 
 |                           A double, half<replaceable>n</replaceable>, | 
 |                           float<replaceable>n</replaceable> or double<replaceable>n</replaceable> | 
 |                           argument representing a floating-point number is converted in the style | 
 |                           <replaceable>[−]0xh.hhhh</replaceable> p±<replaceable>d</replaceable>, | 
 |                           where there is one hexadecimal digit (which is nonzero if the argument | 
 |                           is a normalized floating-point number and is otherwise unspecified) | 
 |                           before the decimal-point character) and the number of hexadecimal digits | 
 |                           after it is equal to the precision; if the precision is missing, then | 
 |                           the precision is sufficient for an exact representation of the value; | 
 |                           if the precision is zero and the # flag is not specified, no decimal | 
 |                           point character appears. The letters abcdef are used for a conversion | 
 |                           and the letters ABCDEF for A conversion. The A conversion specifier | 
 |                           produces a number with X and P instead of x and p. The exponent | 
 |                           always contains at least one digit, and only as many more digits as | 
 |                           necessary to represent the decimal exponent of 2. If the value is zero, | 
 |                           the exponent is zero.  A double, half<replaceable>n</replaceable>, | 
 |                           float<replaceable>n</replaceable> or double<replaceable>n</replaceable> | 
 |                           argument representing an infinity or NaN is converted in the style | 
 |                           of an f or F conversion specifier. Binary implementations can choose | 
 |                           the hexadecimal digit to the left of the decimal-point character so | 
 |                           that subsequent digits align to nibble (4-bit) boundaries. | 
 |                         </entry> | 
 |                     </row> | 
 |                 </tbody> | 
 |             </tgroup> | 
 |         </informaltable> | 
 |  | 
 |         <para> | 
 |           NOTE:  The conversion specifiers e,E,g,G,a,A convert a float or half argument that is | 
 |           a scalar type to a double only if the double data type is supported.  If the double | 
 |           data type is not supported, the argument will be a float instead of a double and the | 
 |           half type will be converted to a float. | 
 |         </para> | 
 |  | 
 |         <informaltable frame="all"> | 
 |             <tgroup cols="2" align="left" colsep="1" rowsep="1"> | 
 |                 <colspec colname="col1" colnum="1" /> | 
 |                 <colspec colname="col2" colnum="2" /> | 
 |                 <tbody> | 
 |                     <row> | 
 |                         <entry>c</entry> | 
 |                         <entry> | 
 |                             The int argument is converted to an unsigned char, and the resulting character is written. | 
 |                         </entry> | 
 |                     </row> | 
 |  | 
 |                     <row> | 
 |                         <entry>s</entry> | 
 |                         <entry> | 
 |                             The argument shall be a literal string. No special provisions are made | 
 |                             for multibyte characters. The behavior of <function>printf</function> | 
 |                             with the s conversion specifier is undefined if the argument value | 
 |                             is not a pointer to a literal string. Characters from the literal | 
 |                             string array are written up to (but not including) the terminating | 
 |                             null character. If the precision is specified, no more than that many | 
 |                             bytes are written. If the precision is not specified or is greater | 
 |                             than the size of the array, the array shall contain a null character. | 
 |                         </entry> | 
 |                     </row> | 
 |  | 
 |                     <row> | 
 |                         <entry>p</entry> | 
 |                         <entry> | 
 |                             The argument shall be a pointer to void. The pointer can refer to | 
 |                             a memory region in the global, constant, local or private address | 
 |                             space. The value of the pointer is converted to a sequence of | 
 |                             printing characters in an implementation-defined manner. | 
 |                         </entry> | 
 |                     </row> | 
 |  | 
 |                     <row> | 
 |                         <entry>%</entry> | 
 |                         <entry> | 
 |                             A % character is written. No argument is converted. The complete conversion | 
 |                             specification shall be %%. | 
 |                         </entry> | 
 |                     </row> | 
 |                 </tbody> | 
 |             </tgroup> | 
 |         </informaltable> | 
 |  | 
 |         <para> | 
 |           If a conversion specification is invalid, the behavior is undefined. If any argument | 
 |           is not the correct type for the corresponding conversion specification, the behavior | 
 |           is undefined. | 
 |         </para> | 
 |  | 
 |         <para> | 
 |           In no case does a nonexistent or small field width cause truncation of a field; if | 
 |           the result of a conversion is wider than the field width, the field is expanded to | 
 |           contain the conversion result. | 
 |         </para> | 
 |  | 
 |         <para> | 
 |           For a and A conversions, the value is correctly rounded to a hexadecimal floating | 
 |           number with the given precision. | 
 |         </para> | 
 |  | 
 |         <bridgehead>Differences between OpenCL C and C99 <function>printf</function></bridgehead> | 
 |  | 
 |         <itemizedlist mark="disc"> | 
 |             <listitem> | 
 |                 The l modifier followed by a c conversion specifier or s conversion specifier | 
 |                 is not supported by OpenCL C. | 
 |             </listitem> | 
 |  | 
 |             <listitem> | 
 |                 The ll, j, z, t, and L length modifiers are not supported by OpenCL C but are reserved. | 
 |             </listitem> | 
 |  | 
 |             <listitem> | 
 |                 The n conversion specifier is not supported by OpenCL C but is reserved. | 
 |             </listitem> | 
 |  | 
 |             <listitem> | 
 |                 OpenCL C adds the optional v<replaceable>n</replaceable> vector specifier to support printing of vector types. | 
 |             </listitem> | 
 |  | 
 |             <listitem> | 
 |                 The conversion specifiers f, F, e, E, g, G, a, A convert a float argument to | 
 |                 a double only if the double data type is supported. Refer to the description | 
 |                 of <constant>CL_DEVICE_DOUBLE_FP_CONFIG</constant>. If the double data type is | 
 |                 not supported, the argument will be a float instead of a double. | 
 |             </listitem> | 
 |  | 
 |             <listitem> | 
 |                 For the embedded profile, the l length modifier is supported only if 64-bit integers are supported. | 
 |             </listitem> | 
 |  | 
 |             <listitem> | 
 |                 In OpenCL C, <function>printf</function> returns 0 if it was executed successfully | 
 |                 and -1 otherwise vs. C99 where <function>printf</function> returns the number | 
 |                 of characters printed or a negative value if an output or encoding error occurred. | 
 |             </listitem> | 
 |  | 
 |             <listitem> | 
 |                 In OpenCL C, the conversion specifier s can only be used for arguments that are literal strings. | 
 |             </listitem> | 
 |         </itemizedlist> | 
 |    </refsect1> | 
 |  | 
 | <!-- ================================ EXAMPLE  --> | 
 | <!-- DO NOT DELETE IN CASE AN EXAMPLE IS ADDED IN THE FUTURE --> | 
 | <!--    --> | 
 |  | 
 |     <refsect2 id="example1"> | 
 |         <title> | 
 |             Examples | 
 |         </title> | 
 |         <informaltable frame="none"> | 
 |             <tgroup cols="1" align="left" colsep="0" rowsep="0"> | 
 |                 <colspec colname="col1" colnum="1" /> | 
 |                 <tbody> | 
 |                     <row> | 
 |                         <entry> | 
 |      float4 f = (float4)(1.0f, 2.0f, 3.0f, 4.0f); | 
 |      uchar4 uc = (uchar4)(0xFA, 0xFB, 0xFC, 0xFD); | 
 |  | 
 |      printf("f4 = %2.2v4hlf\n", f); | 
 |      printf("uc = %#v4hhx\n", uc); | 
 |  | 
 | // The above two calls print the following: | 
 |  | 
 |      f4 = 1.00,2.00,3.00,4.00 | 
 |      uc = 0xfa,0xfb,0xfc,0xfd | 
 |                         </entry> | 
 |                     </row> | 
 |                 </tbody> | 
 |             </tgroup> | 
 |         </informaltable> | 
 |  | 
 |         <para> | 
 |           A few examples of valid use cases of <function>printf</function> for the conversion | 
 |           specifier s are given below. The argument value must be a pointer to a literal string. | 
 |         </para> | 
 |  | 
 |         <informaltable frame="none"> | 
 |             <tgroup cols="1" align="left" colsep="0" rowsep="0"> | 
 |                 <colspec colname="col1" colnum="1" /> | 
 |                 <tbody> | 
 |                     <row> | 
 |                         <entry> | 
 |      kernel void my_kernel( ... ) | 
 |      { | 
 |          printf("%s\n", "this is a test string\n"); | 
 |      } | 
 |                         </entry> | 
 |                     </row> | 
 |                 </tbody> | 
 |             </tgroup> | 
 |         </informaltable> | 
 |  | 
 |         <para> | 
 |           A few examples of invalid use cases of <function>printf</function> for the conversion | 
 |           specifier s are given below: | 
 |         </para> | 
 |  | 
 |         <informaltable frame="none"> | 
 |             <tgroup cols="1" align="left" colsep="0" rowsep="0"> | 
 |                 <colspec colname="col1" colnum="1" /> | 
 |                 <tbody> | 
 |                     <row> | 
 |                         <entry> | 
 |      kernel void my_kernel(global char *s, ... ) | 
 |      { | 
 |          printf("%s\n", s); | 
 |  | 
 |          constant char *p = "this is a test string\n"; | 
 |          printf("%s\n", p); | 
 |          printf("%s\n", &p[3]); | 
 |      } | 
 |                         </entry> | 
 |                     </row> | 
 |                 </tbody> | 
 |             </tgroup> | 
 |         </informaltable> | 
 |  | 
 |         <para> | 
 |           A few examples of invalid use cases of printf where data types given by the vector | 
 |           specifier and length modifier do not match the argument type are given below: | 
 |         </para> | 
 |  | 
 |         <informaltable frame="none"> | 
 |             <tgroup cols="1" align="left" colsep="0" rowsep="0"> | 
 |                 <colspec colname="col1" colnum="1" /> | 
 |                 <tbody> | 
 |                     <row> | 
 |                         <entry> | 
 |      kernel void my_kernel(global char *s, … ) | 
 |      { | 
 |           uint2 ui = (uint2)(0x12345678, 0x87654321); | 
 |           printf("unsigned short value = (%#v2hx)\n", ui) | 
 |           printf("unsigned char value = (%#v2hhx)\n", ui) | 
 |      } | 
 |                         </entry> | 
 |                     </row> | 
 |                 </tbody> | 
 |             </tgroup> | 
 |         </informaltable> | 
 |     </refsect2> | 
 |  | 
 | <!-- ================================ SPECIFICATION  --> | 
 | <!-- Set the "uri" attribute in the <olink /> element to the "named destination" for the PDF page | 
 | --> | 
 |     <refsect1 id="specification"><title>Specification</title> | 
 |         <para> | 
 |             <imageobject> | 
 |                 <imagedata fileref="pdficon_small1.gif" format="gif" /> | 
 |             </imageobject> | 
 |  | 
 |  | 
 |             <olink uri="printfFunction">OpenCL Specification</olink> | 
 |         </para> | 
 |     </refsect1> | 
 |  | 
 | <!-- ================================ ALSO SEE | 
 |  | 
 |     <refsect1 id="seealso"><title>Also see</title> | 
 |         <para> | 
 |             <citerefentry><refentrytitle>clFlush</refentrytitle></citerefentry> | 
 |         </para> | 
 |     </refsect1>--> | 
 |  | 
 | <!-- ================================ COPYRIGHT  --> | 
 | <!-- Content included from copyright.inc.xsl --> | 
 |  | 
 |     <refsect3 id="Copyright"><title></title> | 
 |         <imageobject> | 
 |                 <imagedata fileref="KhronosLogo.jpg" format="jpg" /> | 
 |  | 
 |         </imageobject> | 
 |         <para /> | 
 |     </refsect3> | 
 |  | 
 | <!-- 9-Nov-2015, API ver 2.1 rev 19; Ext ver 2.1 rev 10; C lang ver 2.0 rev 30 --> | 
 | </refentry> | 
 |  |