Форум программистов, компьютерный форум CyberForum.ru

Быстрое возведение в степень - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Написать справочник намеченных дел и мероприятий. http://www.cyberforum.ru/cpp-beginners/thread823801.html
Справочник намеченных дел и мероприятий. 1.Список намеченных мероприятий(дата, время, длительность, место проведения) 2.Реализуемые функции: напоминание о ближайшем мероприятии (по текущей дате и времени), удаление прошедших мероприятий или перенос их на будущее, анализ накладок(пересечений планируемых дел).
C++ ZeroMemory в конструкторе b __vfptr Есть два базовый и производный классы с виртуальными методами. В конструкторах хочу обнулить все поля, но если я делаю ZeroMemory(this ,sizeof(this)); то заодно обнуляется таблица __vfptr, и что закономерно - моя поделка не работает. Есть какие-нибудь методы альтернативные, чтобы в ручную не перечислять все члены присваивая им нули? http://www.cyberforum.ru/cpp-beginners/thread823793.html
C++ Определить периметр и площадь треугольника
Помогите решить задачку, в треугольнике (рис.1) заданы углы А, В и радиус описанной окружности R. Вычислить и вывести все остальные элементы треугольника, периметр P и площадь S.
C++ Динамические массивы разных размеров
Дан файл вида, например, такого: 9 7 5 -5 7 3 -6 9 2 1 13 6 2 -4 42 -13 3 0 5 8 -11 4 -11 3 8 -5 2 3 5 -3 9 3 5 -2 1 0 0 23 6 9 9 5 17 -13
C++ метод касательных http://www.cyberforum.ru/cpp-beginners/thread823729.html
нужно написать прогу с помощью метода касательных для решения задач извлечения корня из произвольного положительного числа a.Значение корня из a ,как решение уравнения F(x)=x2-a=0 Рекурентная формула в данном случае принимает вид xn+1=1\2(xn+a\xn). E=0.001
C++ задача! S = sin X + sin X^2 + sin x^3 + sin X^4+…+sin X^n Может кто знает? Ребят? S = sin X + sin X^2 + sin x^3 + sin X^4+…+sin X^n вот тут что то нахимичил, но мне кажется не правильно #include "stdafx.h" #include <iostream> #include <math.h> #include <stdio.h> подробнее

Показать сообщение отдельно
BRcr
4006 / 2295 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
02.04.2013, 14:03     Быстрое возведение в степень
Любопытства ради провел тест на скорость. По убыванию скорости:
  1. библиотечный pow;
  2. через логарифм;
  3. через цикл;
  4. рекурсия.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
long double _pow_( double x, double y )
{
    long double res( x );
    while ( --y )
    {
        res *= x;
    }
    return res;
}
long double log_pow( double x, double y )
{
    return exp( y * log( x ) );
}
long double rec_pow( double x, double y )
{
    return y > 0 ? x * rec_pow( x, --y ) : 1;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
    t_time_counter tc;
    long double x = 2, y = 100, res;
    size_t lim = 1000000;
    char y_n;
 
    while ( cin >> y_n, y_n == 'y' )
    {
        tc.start( );
        for ( size_t i = 0; i < lim; ++i )
        {
            res = pow( x, y );
        }
        tc.stop( );
        cout << "pow = \t\t" << res << "\t\t" << tc.get_time_string( ).get( ) << endl;
 
        tc.start( );
        for ( size_t i = 0; i < lim; ++i )
        {
            res = _pow_( x, y );
        }
        tc.stop( );
        cout << "_pow_ = \t" << res << "\t\t" << tc.get_time_string( ).get( ) << endl;
 
        tc.start( );
        for ( size_t i = 0; i < lim; ++i )
        {
            res = log_pow( x, y );
        }
        tc.stop( );
        cout << "log_pow = \t" << res << "\t\t" << tc.get_time_string( ).get( ) << endl;
 
        tc.start( );
        for ( size_t i = 0; i < lim; ++i )
        {
            res = rec_pow( x, y );
        }
        tc.stop( );
        cout << "rec_pow = \t" << res << "\t\t" << tc.get_time_string( ).get( ) << endl;
    }
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class t_time_counter
{
public:
    DWORD full_time;
    unsigned int hours, mins, secs, msecs;
    void __fastcall start( ) {
        full_time = GetTickCount( );
    }
    void __fastcall stop( )
    {
        full_time = GetTickCount( ) - full_time;
        hours = ( mins = ( secs = full_time / 1000 ) / 60 ) / 60;
        mins %= 60;
        secs %= 60;
        msecs = full_time % 1000;
    }
    typedef std::auto_ptr <TCHAR> auto_ptr_tchar;
    auto_ptr_tchar __fastcall get_time_string( )
    {
        auto_ptr_tchar ptr( new TCHAR[255] );
        if ( SUCCEEDED(
                StringCchPrintf( ptr.get( ), 255, _T( "h: %u, m: %u, s: %u, ms: %u" ), hours, mins, secs, msecs )
            ) )
        {
            return ptr;
        }
        return auto_ptr_tchar( );
    }
};
Миниатюры
Быстрое возведение в степень  
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru