На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Fortran и исходники GCC , формат чисел непонятный
    Изучал тут файл один из GCC: "\libgfortran\intrinsics\c99_functions.c" и такое увидел:
    ExpandedWrap disabled
      long double
      log10l (long double x)
      {
      #if LDBL_MAX_EXP > DBL_MAX_EXP
        if (x > DBL_MAX)
          {
            double val;
            int p2_result = 0;
            if (x > 0x1p16383L) { p2_result += 16383; x /= 0x1p16383L; }
            if (x > 0x1p8191L) { p2_result += 8191; x /= 0x1p8191L; }
            if (x > 0x1p4095L) { p2_result += 4095; x /= 0x1p4095L; }
            if (x > 0x1p2047L) { p2_result += 2047; x /= 0x1p2047L; }
            if (x > 0x1p1023L) { p2_result += 1023; x /= 0x1p1023L; }
            val = log10 ((double) x);
            return (val + p2_result * .30102999566398119521373889472449302L);
          }
      #endif
      #if LDBL_MIN_EXP < DBL_MIN_EXP
        if (x < DBL_MIN)
          {
            double val;
            int p2_result = 0;
            if (x < 0x1p-16380L) { p2_result += 16380; x /= 0x1p-16380L; }
            if (x < 0x1p-8189L) { p2_result += 8189; x /= 0x1p-8189L; }
            if (x < 0x1p-4093L) { p2_result += 4093; x /= 0x1p-4093L; }
            if (x < 0x1p-2045L) { p2_result += 2045; x /= 0x1p-2045L; }
            if (x < 0x1p-1021L) { p2_result += 1021; x /= 0x1p-1021L; }
            val = fabs (log10 ((double) x));
            return (- val - p2_result * .30102999566398119521373889472449302L);
          }
      #endif
          return log10 (x);
      }
    Мой FAR подсвечивает числа вида 0x1p... как ошибки. Подскажите, кто неправ: FAR или тут намудрили?
      это шестнадцатеричная запись числа с плавающей запятой, после `p` идет экспонента (как после `E` в десятичной записи)
        Это "штучки" C99. Видимо плагин FAR-а такое еще не понимает.
        ExpandedWrap disabled
          0x1p-16380L = 1.0 * 2^(-16380) ~= 1.34484e-4931


        здесь пример
          Спасибо всем. Видимо, здешний парсер-краситель тоже не идеален... Печалька.
            Хм-м... а расширили ли двоичную запись для плавающих?
            Т.е. нечто вида 0b0110011p11011 ?
            :-?
              Не, это только для
              Цитата
              2) The exponent syntax for hexadecimal floating-point constant

              link

              Может в пропозалах кто-то что-то и написал, но вряд ли это имеет смысл.
              Шестнадцатиричная запись компактнее и проще воспринимается, чем двоичная.
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0284 ]   [ 17 queries used ]   [ Generated: 20.04.24, 00:42 GMT ]