I think it needs more digits. It might be best to use M_PI casted to float.

v2:

Hi Tom,

Why do you write this hexadecimal value directly as a float, i.e., as 3.14159274101257f ?

Jeroen

Hi Jeroen,

I used this test program to generate the hexadecimal constant for pi:

#include <math.h>
#include <stdio.h>

int main(int argc, char ** argv)
{
union {
float f;
unsigned i;
} pi;
pi.f = M_PI;
fprintf(stderr, "Pi = %f pi = 0x%x\n", pi.f, pi.i);

}

-Tom

I think this is technically undefined behavior that everyone violates. If you want the hex constant, you could use the format that comes out of the %a format specifier:

float cast = M_PI;
printf("M_PI %a\n", M_PI);
printf("M_PI cast float: %a\n", cast);

Gives me:

M_PI 0x1.921fb54442d18p+1
M_PI cast float: 0x1.921fb6p+1

> v2:
> - Use a hexadecimal constant.
> ---
> generic/include/clc/float/definitions.h | 11 +++++++++++
> 1 file changed, 11 insertions(+)
>
> diff --git a/generic/include/clc/float/definitions.h b/generic/include/clc/float/definitions.h
> index e6ef1d8..a6c947f 100644
> --- a/generic/include/clc/float/definitions.h
> +++ b/generic/include/clc/float/definitions.h
> @@ -9,6 +9,17 @@
> #define FLT_MIN 0x1.0p-126f
> #define FLT_EPSILON 0x1.0p-23f
>
> +_CLC_INLINE static float m_pi_f() {
> + union {
> + unsigned i;
> + float f;
> + } pi;
> + pi.i = 0x40490fdb;
> + return pi.f;
> +}
> +
> +#define M_PI_F m_pi_f()
> +
> #ifdef cl_khr_fp64
>
> #define DBL_DIG 15
I think this is technically undefined behavior that everyone violates.

type-punning is afaik legal in c99 (implementation defined in c89),
"man gcc" includes an example same as this use-case

quick search gives this:
http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_283.htm

although I'd ask the same question as Jeroen,

what's wrong with 3.14159274101257f ?

regards,

The form of type-punning Tom uses is perfectly legal in OpenCL 1.2: see section 6.2.4.1.

I don’t see point of using it though. Specifying a float directly with a sufficient number of digits seems a much clearer solution.

Jeroen

The form of type-punning Tom uses is perfectly legal in OpenCL 1.2: see section 6.2.4.1.

I don’t see point of using it though. Specifying a float directly with a sufficient number of digits seems a much clearer solution.

Maybe I'm being overly cautious, but with the hexadecimal format,
I know exactly what value I'm getting, but with the floating point
format, I worry that different compilers / hardware might do slightly
different things.

-Tom

I think you can reasonably argue that the compiler/hardware is faulty in case they do slightly different things. They have to follow the IEE standard here.

Jeroen