LINUX.ORG.RU
решено ФорумTalks

Шарпиньон или втф?

 ,


0

2
int power(int t, int k) // возведение t в степень k
{
  int res = 1;
  while (k) 
      {
	if (k & 1) 
           res *= t;
	t *= t;
	k >>= 1;
      }
  return res;
}

и почему так дохера на на шарпе?

static int Pow2(int a, int b)//Int32-версия
        {
            if (b > 2 && (a > 1 || a < -1))
            {
                bool sgn = false;
                if (a < 0) { if (b % 2 != 0) sgn = true; a = -a; }
                if (a < 1291)
                {
                    if (a > 215) { if (b > 3) throw new OverflowException();
                    else return sgn ? -pow[a + 406] : pow[a + 406]; }
                    else
                    {
                        if (ind[a] + b - 3 >= ind[a + 1]) throw new OverflowException();
                        else return sgn ? -pow[ind[a] + b] : pow[ind[a] + b];
                    }
                }
                else throw new OverflowException();
            }
            else
            {
                if (b == 2) return checked(a * a);
                if (b == 1) return a;
                if (b == 0) return 1;//0^0 тоже принято за 1
                if (a == 1) return 1;
                if (a == 0 && b > 0) return 0;
                if (a == -1) return b % 2 == 0 ? 1 : -1;
                throw new InvalidOperationException();
            }
        }

★★★★★

а что за магические числа?

int13h ★★★★★
()

Ничего, что эти программы делают разные вещи и первая молча (и, возможно, долго) вернёт неверный результат при некоторых аргументах?

x3al ★★★★★
()

на шарпе с исключениями и прочими перделками. а вообще, надо хотя бы сказать, что за программы, ибо ЯННП.

Lincor
()

Потому что в шарп-версии отлавливаются переполнения и много магических чисел, а также есть проверки случаев, когда считать особо не нужно.

Lilly
()

судя по всему в шарпе есть табличка степеней для чисел меньше 1291

Deleted
()

Есть подозрение что шарп заинлайнит функцию и будет ее рассматривать вместе с кодом его вызывающим. А это с кучей if может себя вести частично как макрос

vertexua ★★★★★
()
Ответ на: комментарий от splinter

Пффф... А что там понимать-то? Синтаксис там тот же.

CYB3R ★★★★★
()

как только люди не извращаются, лишь бы не использовать питон...

der_looser ★★
()
Ответ на: комментарий от splinter

std
нет в стандартной

/0

System.Math - это Base Class Library

куда уж стандартнее?

Uter
()
Последнее исправление: Uter (всего исправлений: 1)

А ничего, что в первом варианте есть цикл, а во втором его нет? Кэп намекает, что второй вариант более хитрый и оптимизированный.

AntonK
()

Хотелось бы увидеть хотя бы сами pow и ind в шарповой версии, которые, вероятно, объявлены глобально.

Ну и да, в шарповской версии нет цикла, но есть магические числа, что заставляет задуматься о том, что это могло быть оптимизацией.

Deleted
()
Ответ на: комментарий от Deleted

System.Math.Pow в шарпе - это псевдоним для нативной реализации внутри рантайма, написанной на C++

FCIMPL2_VV(double, COMDouble::Pow, double x, double y)
{
    WRAPPER_CONTRACT;
    STATIC_CONTRACT_SO_TOLERANT;

    double r1;
    if(IS_DBL_INFINITY(y)) {
        if(IS_DBL_ONE(x)) {
            return x;        
        }

        if(IS_DBL_NEGATIVEONE(x)) {
            *((INT64 *)(&r1)) = CLR_NAN_64;
            return r1;
        }    
    }
    else if(_isnan(y) || _isnan(x)) {
        *((INT64 *)(&r1)) = CLR_NAN_64;
        return r1;
    }
    
    return (double) pow(x, y);
}
FCIMPLEND
Uter
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.