#include <perms.h>
int _imp_mainep(int _imp_argc, char **_imp_argv) {
  static const int Intptsel = 0;
  static const int Improunds = 1;
  void Prhex(int Value, int Places) {
    static const _imp_string Hex[16 /*0:15*/] = {
        _imp_str_literal("0"), _imp_str_literal("1"), _imp_str_literal("2"),
        _imp_str_literal("3"), _imp_str_literal("4"), _imp_str_literal("5"),
        _imp_str_literal("6"), _imp_str_literal("7"), _imp_str_literal("8"),
        _imp_str_literal("9"), _imp_str_literal("A"), _imp_str_literal("B"),
        _imp_str_literal("C"), _imp_str_literal("D"), _imp_str_literal("E"),
        _imp_str_literal("F")};
    int I;
    for (I = (Places << 2) - 4; I >= 0; I -= 4)
      Printstring(Hex[(unsigned)Value >> I & 15]);
  }
  void Error(int Val) { Printstring(_imp_str_literal("error")); }
  auto float Powrr(float Argx, float Argy);
  static int Powerneg = 23;
  static int Powerzero = 22;
  static int Powerbig = 24;
  static int Powersmall = 25;
  static const int Expexcess = 126;
  static const int Maxexp = 254;
  static const int Minexp = 1;
  static const float Greatest = 3.4028234664 @38;
  static const float One = 1.0;
  static const float Sixteenth = 0.0625;
  static const float Zero = 0.0;
  static const int Iexp = 0x7F800000;
  static const int Imant = 0x007FFFFF;
  static const int Expext23 = 0x3F000000;
  static const int Expadd1 = 0x00800000;
  static const int Expadd3 = 0x02000000;
  float Powrr(float Arg1, float Arg2) {
    static const float A1[17 /*1:17*/] = {
        0x1.3F800000fp0, 0x1.3F75257Dfp0, 0x1.3F6AC0C7fp0, 0x1.3F60CCDFfp0,
        0x1.3F5744FDfp0, 0x1.3F4E248Cfp0, 0x1.3F45672Afp0, 0x1.3F3D08A4fp0,
        0x1.3F3504F3fp0, 0x1.3F2D583Ffp0, 0x1.3F25FED7fp0, 0x1.3F1EF532fp0,
        0x1.3F1837F0fp0, 0x1.3F11C3D3fp0, 0x1.3F0B95C2fp0, 0x1.3F05AAC3fp0,
        0x1.3F000000fp0};
    static const float A2[8 /*1:8*/] = {
        0x1.31A92430fp0, 0x1.B19EAB58fp0, 0x1.31A8FC20fp0, 0x1.B2C14FE6fp0,
        0x1.B1ADEAF0fp0, 0x1.32C12342fp0, 0x1.32E75622fp0, 0x1.32CF9890fp0};
    static const float K = 0.44269504088896341;
    static const float P1 = 0.83357 541 @-1;
    static const float Q1 = 0.69314 675 @0;
    static const float Q2 = 0.24018 510 @0;
    static const float Q3 = 0.54360 383 @-1;
    static const int Iw1max = 4030;
    static const int Iw1min = -4159;
    int Pp;
    int P;
    int N;
    int M;
    int M16;
    int Iw1;
    int Iy;
    float D;
    float Z;
    float R;
    float V;
    float G;
    float X;
    float Y;
    float U1;
    float U2;
    float W;
    float W1;
    float W2;
    double Uu1;
    double Uu2;
    double Ww;
    X = Arg1;
    Y = Arg2;
    if (X <= Zero) {
      if (X == Zero && Y > Zero) return (Zero);

#if 0 /* Intptsel */
Iy = Intpt(Y);if (Intptsel==2 && Iy < 0) Iy++ ;
#else
      Iy = Trunc(Y);
#endif
      if (Y != Float(Iy)) Error(Powerneg);
    }
    M = ((unsigned)(*Integer(Addr(X)) & Iexp) >> 23) - Expexcess;
    G = X;
    *Integer(Addr(G)) = Expext23 | (Imant & *Integer(Addr(G)));
    P = 1;
    if (G <= A1[9]) P = 9;
    if (G <= A1[P + 4]) P += 4;
    if (G <= A1[P + 2]) P += 2;
    Pp = P + 1;
    Z = (G - A1[Pp]);
    Z -= A2[(unsigned)Pp >> 1];
    D = (G + A1[Pp]);
    *Integer(Addr(D)) = *Integer(Addr(D)) - Expadd1;
    Z = Z / D;
    V = Z * Z;
    R = P1 * V * Z;
    R += K * R;
    U2 = (R + Z * K) + Z;
    if (M > 0)
      M16 = M << 4;
    else
      M16 = -(-M) << 4;
    U1 = Float(M16 - P);
    if (M16 != P) *Integer(Addr(U1)) = *Integer(Addr(U1)) - Expadd3;
    Uu1 = U1;
    Uu2 = U2;
    Ww = Y * (Uu1 + Uu2);
    W = Ww;
#if 0 /*  !Improunds */
Ww += Ww - W;W = Ww;
#endif
    if (W != Zero) {
      *Integer(Addr(W)) = *Integer(Addr(W)) + Expadd3;
      W1 = Float(Int(W));
      W = W1;
      if (W1 != Zero) *Integer(Addr(W1)) = *Integer(Addr(W1)) - Expadd3;
      W2 = Ww - W1;
#if 1 /*  !Intptsel */
      Iw1 = Trunc(W);
#else
      Iw1 = Intpt(W);
#endif

#if 0 /* Intptsel==2 */
if (Iw1 < 0) Iw1++ ;
#endif
    } else {
      W1 = Zero;
      W2 = Zero;
      Iw1 = 0;
    }
    if (W2 > Zero) {
      W2 -= Sixteenth;
      Iw1++;
    }
    if (Iw1 < 0) {
      P = ((unsigned)(-Iw1) >> 4);
      M = -P;
      P = -(P << 4) - Iw1 + 1;
    } else {
      M = ((unsigned)Iw1 >> 4) + 1;
      P = (M << 4) - Iw1 + 1;
    }
    Z = (((Q3 * W2 + Q2) * W2 + Q1) * W2) * A1[P] + A1[P];
    if (Z == Zero)
      return (Zero);
    else {
      N = ((unsigned)(*Integer(Addr(Z)) & Iexp) >> 23) + M;
      if (N > Maxexp || N < Minexp) {
        if (N < Minexp) return (Zero);
        Error(Powerbig);
        return (Greatest);
      }
      *Integer(Addr(Z)) = N << 23 | (Imant & *Integer(Addr(Z)));
      return (Z);
    }
  }
  float X;
  float Y;
  float Z;
  X = 2;
  Y = 4;
  Z = Powrr(X, Y);
  if (Mod(Z - 16) < 0.000001)
    Printstring(_imp_str_literal("Test ok"));
  else
    Printfl(16 - Z, 9);
  exit(0);
  return (1);
}
