What is the purpose of COERCE_FLOAT and COERCE_UNSIGNED_INT macros in the Hex Rays decompiled code below?double __cdecl sub_401580(float a1){  unsigned int v1; // eax@1  double v2; // st7@1  float v4; // [sp+10h] [bp+4h]@1  float v5; // [sp+10h] [bp+4h]@1  v1 = LODWORD(a1) & 0x80000000;  v4 = 1.273239493370056 * a1 - a1 * 0.4052847325801849 * COERCE_FLOAT(LODWORD(a1) & 0x7FFFFFFF);  v2 = v4;  v5 = v4 * v4;  return (float)(v5               * ((v5 * COERCE_FLOAT(v1 ^ COERCE_UNSIGNED_INT(-0.0032225901))                 + COERCE_FLOAT(v1 | COERCE_UNSIGNED_INT(0.015124941)))                * v5                + COERCE_FLOAT(v1 | COERCE_UNSIGNED_INT(0.20363937)))               + v2 * 0.7844448685646057);}
IDA decompiler macro
ida;hexrays;decompiler;float