Как дела *целое число* возведение в степень в C#?

45
задан Jay Bazuzi 20 December 2008 в 21:37
поделиться

4 ответа

Довольно быстрый мог бы быть чем-то вроде этого:

int IntPow(int x, uint pow)
{
    int ret = 1;
    while ( pow != 0 )
    {
        if ( (pow & 1) == 1 )
            ret *= x;
        x *= x;
        pow >>= 1;
    }
    return ret;
}

Примечание, что это не позволяет отрицательные полномочия. Я оставлю это как осуществление Вам.:)

Добавленный: Ах да, почти забыл - также добавляют проверку переполнения/потери значимости, или Вы могли бы быть в для нескольких противных неожиданностей в будущем.

45
ответ дан Vilx- 8 November 2019 в 00:43
поделиться

Используя математику в ссылке блога John Cook,

    public static long IntPower(int x, short power)
    {
        if (power == 0) return 1;
        if (power == 1) return x;
        // ----------------------
        int n = 15;
        while ((power <<= 1) >= 0) n--;

        long tmp = x;
        while (--n > 0)
            tmp = tmp * tmp * 
                 (((power <<= 1) < 0)? x : 1);
        return tmp;
    }           

для обращения к возражению, что код не будет работать при изменении типа питания, хорошо... не принимая во внимание точку, что любой, кто изменяет код, они не понимают и затем используют его без тестирования.....
, но решать проблему, эта версия защищает глупое от той ошибки... (Но не от несметного числа других они могли бы сделать), ПРИМЕЧАНИЕ: не протестированный.

    public static long IntPower(int x, short power)
    {
        if (power == 0) return 1;
        if (power == 1) return x;
        // ----------------------
        int n = 
            power.GetType() == typeof(short)? 15:
            power.GetType() == typeof(int)? 31:
            power.GetType() == typeof(long)? 63: 0;  

        long tmp = x;
        while (--n > 0)
            tmp = tmp * tmp * 
                 (((power <<= 1) < 0)? x : 1);
        return tmp;
    }

Также попытка этот рекурсивный эквивалент (медленнее, конечно):

    public static long IntPower(long x, int power)
    {
        return (power == 0) ? x :
            ((power & 0x1) == 0 ? x : 1) *
                IntPower(x, power >> 1);
    }
19
ответ дан Charles Bretana 8 November 2019 в 00:43
поделиться

Вот сообщение в блоге , который объясняет самый быстрый способ повысить целые числа до целочисленных полномочий. Как один из комментариев указывает, некоторые из этих приемов встроены в микросхемы.

7
ответ дан John D. Cook 8 November 2019 в 00:43
поделиться

Использование двойная версия, проверьте на переполнение (по макс. интервалу или макс. долго) и бросьте к интервалу или долго?

4
ответ дан bh213 8 November 2019 в 00:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: