double FUN_0048a9e0(char *param_1,undefined4 *param_2,char *param_3)

{
  bool bVar1;
  undefined4 *puVar2;
  int iVar3;
  char *pcVar4;
  int iVar5;
  int iVar6;
  uint uVar7;
  uint uVar8;
  char *pcVar9;
  ushort uVar10;
  uint uVar11;
  undefined4 uVar12;
  char *pcVar13;
  double dVar14;
  double dVar15;
  
  pcVar13 = param_1;
  while (iVar3 = (int)*pcVar13, (*(ushort *)(PTR_DAT_004b7614 + iVar3 * 2) & 0x20) != 0) {
    pcVar13 = pcVar13 + 1;
  }
  if (iVar3 == 0x2b) {
    bVar1 = false;
  }
  else {
    bVar1 = false;
    if (iVar3 != 0x2d) goto LAB_0048aa60;
    bVar1 = true;
  }
  pcVar13 = pcVar13 + 1;
  iVar3 = (int)*pcVar13;
LAB_0048aa60:
  if ((iVar3 == 0x30) && (pcVar9 = pcVar13 + 1, (byte)(pcVar13[1] | 0x20U) == 0x78)) {
    pcVar13 = pcVar13 + 2;
    dVar15 = 16.0;
    uVar11 = 0x70;
    uVar10 = 0x10;
  }
  else {
    uVar11 = 0x65;
    dVar15 = 10.0;
    pcVar9 = (char *)0x0;
    uVar10 = 8;
  }
  iVar3 = -1;
  dVar14 = 0.0;
  pcVar4 = (char *)0x0;
  do {
    while( true ) {
      uVar7 = (uint)((ulonglong)dVar14 >> 0x20);
      uVar12 = SUB84(dVar14,0);
      uVar8 = (uint)*pcVar13;
      if ((*(ushort *)(PTR_DAT_004b7614 + uVar8 * 2) & uVar10) == 0) break;
      if (iVar3 == -1) {
        iVar3 = 0;
LAB_0048aae4:
        if (uVar8 != 0x30) goto LAB_0048aaf0;
        pcVar13 = pcVar13 + 1;
      }
      else {
        if (iVar3 == 0) goto LAB_0048aae4;
LAB_0048aaf0:
        iVar3 = iVar3 + 1;
        if (iVar3 < 0x12) {
          if ((*(ushort *)(PTR_DAT_004b7614 + uVar8 * 2) & 8) == 0) {
            iVar6 = (uVar8 | 0x20) - 0x57;
          }
          else {
            iVar6 = uVar8 - 0x30;
          }
          dVar14 = dVar14 * dVar15 + (double)iVar6;
          pcVar13 = pcVar13 + 1;
        }
        else {
          pcVar13 = pcVar13 + 1;
        }
      }
    }
    if ((uVar8 != 0x2e) || (pcVar4 != (char *)0x0)) break;
    pcVar4 = pcVar13 + 1;
    pcVar13 = pcVar4;
  } while( true );
  if (iVar3 == -1) {
    if ((pcVar9 == (char *)0x0) && (pcVar9 = param_1, pcVar4 == (char *)0x0)) {
      iVar3 = 0;
      do {
        iVar6 = 0;
        pcVar4 = pcVar13;
        while( true ) {
          iVar5 = iVar6 + iVar3 + 1;
          iVar6 = iVar6 + 1;
          if (*(short *)(PTR_DAT_004b7844 + *pcVar4 * 2) != (short)(char)(&DAT_00499ad0)[iVar5])
          break;
          pcVar4 = pcVar13 + iVar6;
          if ((&DAT_00499ad0)[iVar6 + iVar3 + 1] == '\0') {
            uVar11 = (uint)((ulonglong)((double)iVar3 / 0.0) >> 0x20);
            if (bVar1) {
              uVar11 = uVar11 ^ 0x80000000;
            }
            dVar14 = (double)CONCAT44(uVar11,SUB84((double)iVar3 / 0.0,0));
            pcVar9 = pcVar13 + (char)(&DAT_00499ad0)[iVar3] + -2;
            goto LAB_0048add8;
          }
        }
        iVar3 = iVar3 + (char)(&DAT_00499ad0)[iVar3];
      } while ((&DAT_00499ad0)[iVar3] != '\0');
    }
    goto LAB_0048add8;
  }
  if (0x11 < iVar3) {
    param_3 = param_3 + iVar3 + -0x11;
  }
  if (pcVar4 != (char *)0x0) {
    param_3 = pcVar4 + ((int)param_3 - (int)pcVar13)   //possible issue identified - semgrep
  }
  if (pcVar9 != (char *)0x0) {
    param_3 = (char *)((int)param_3 << 2);
    dVar15 = 2.0;
  }
  if (bVar1) {
    uVar7 = uVar7 ^ 0x80000000;
  }
  dVar14 = (double)CONCAT44(uVar7,uVar12);
  pcVar9 = pcVar13;
  if ((uVar8 | 0x20) == uVar11) {
    pcVar4 = pcVar13 + 1;
    if (pcVar13[1] == '+') {
      iVar3 = 1;
LAB_0048acd4:
      pcVar4 = pcVar13 + 2;
    }
    else {
      iVar3 = 1;
      if (pcVar13[1] == '-') {
        iVar3 = -1;
        goto LAB_0048acd4;
      }
    }
    iVar6 = 0;
    pcVar13 = pcVar4;
    while( true ) {
      if ((*(ushort *)(PTR_DAT_004b7614 + *pcVar13 * 2) & 8) == 0) break;
      if (iVar6 < 0x155) {
        iVar6 = iVar6 * 10 + -0x30 + (int)*pcVar13;
      }
      pcVar13 = pcVar13 + 1;
    }
    param_3 = param_3 + iVar6 * iVar3;
    if (pcVar13 != pcVar4) {
      pcVar9 = pcVar13;
    }
  }
  if ((double)CONCAT44(uVar7,uVar12) != 0.0) {
    dVar14 = (double)CONCAT44(uVar7,uVar12);
    for (uVar11 = ((int)param_3 >> 0x1f ^ (uint)param_3) - ((int)param_3 >> 0x1f); uVar11 != 0;
        uVar11 = (int)uVar11 >> 1) {
      if ((uVar11 & 1) != 0) {
        if ((int)param_3 < 0) {
          dVar14 = dVar14 / dVar15;
        }
        else {
          dVar14 = dVar14 * dVar15;
        }
      }
      dVar15 = dVar15 * dVar15;
    }
    if (dVar14 == dVar14 * 0.25) {
      puVar2 = (undefined4 *)FUN_0047f6f0();
      *puVar2 = 0x22;
    }
  }
LAB_0048add8:
  if (param_2 != (undefined4 *)0x0) {
    *param_2 = pcVar9;
  }
  return dVar14;
}