[Beignet] [PATCH] libocl: fix degrees function precision issue.

Matt Turner mattst88 at gmail.com
Thu Aug 6 12:02:46 PDT 2015


On Thu, Aug 6, 2015 at 12:57 AM,  <xionghu.luo at intel.com> wrote:
> From: Luo Xionghu <xionghu.luo at intel.com>
>
> should define and use M_180_PI_F directly instead of using 180/M_PI_F.
>
> Signed-off-by: Luo Xionghu <xionghu.luo at intel.com>
> ---
>  backend/src/libocl/include/ocl_float.h     | 1 +
>  backend/src/libocl/tmpl/ocl_common.tmpl.cl | 2 +-
>  2 files changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/backend/src/libocl/include/ocl_float.h b/backend/src/libocl/include/ocl_float.h
> index 916233b..e63eaf9 100644
> --- a/backend/src/libocl/include/ocl_float.h
> +++ b/backend/src/libocl/include/ocl_float.h
> @@ -88,6 +88,7 @@ INLINE_OVERLOADABLE int __ocl_finitef (float x){
>  #define M_PI_4_F     0.7853981633974483F
>  #define M_1_PI_F     0.3183098861837907F
>  #define M_2_PI_F     0.6366197723675814F
> +#define M_180_PI_F   57.295779513082321F
>  #define M_2_SQRTPI_F 1.1283791670955126F
>  #define M_SQRT2_F    1.4142135623730951F
>  #define M_SQRT1_2_F  0.7071067811865476F
> diff --git a/backend/src/libocl/tmpl/ocl_common.tmpl.cl b/backend/src/libocl/tmpl/ocl_common.tmpl.cl
> index 76aca2b..136fe70 100644
> --- a/backend/src/libocl/tmpl/ocl_common.tmpl.cl
> +++ b/backend/src/libocl/tmpl/ocl_common.tmpl.cl
> @@ -44,7 +44,7 @@ OVERLOADABLE float clamp(float v, float l, float u) {
>
>
>  OVERLOADABLE float degrees(float radians) {
> -  return (180 / M_PI_F) * radians;
> +  return M_180_PI_F * radians;

I was surprised by this, so I wrote a program to test. Indeed, 180 /
(float)M_PI is less precise:

(float)(180 / M_PI) = 57.29577636718750000 (0x1.ca5dc0p+5) (0x42652ee0)
(180 / (float)M_PI) = 57.29577636718750000 (0x1.ca5dc0p+5) (0x42652ee0)
57.295779513082321F = 57.29578018188476562 (0x1.ca5dc2p+5) (0x42652ee1)

A difference of one bit. :)


More information about the Beignet mailing list