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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
The special one
13 / 13 / 0
Регистрация: 09.03.2012
Сообщений: 112
#1

Быстрое преобразование числа - C++

12.11.2012, 18:24. Просмотров 474. Ответов 9
Метки нет (Все метки)

Здравствуйте уважаемые программисты! Подскажите пожалуйста как быстрее всего получить из положительного числа единицу, а из отрицательного - минус один. Я знаю два способа.
C++
1
2
3
4
5
//способ 1
if(a > 0)a = 1;
if(a < 0)a = -1;
//способ 2
a = a/abs(a);
Какой из этих вариантов будет работать быстрее? Есть ли еще способы, которые будут работать быстрее, чем эти два?
Процедура выполняется во вложенном цикле, поэтому нужно максимальное быстродействие.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.11.2012, 18:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Быстрое преобразование числа (C++):

Быстрое преобразование Фурье - C++
Это пример на сайте wikipedia Быстрого Преобразование Фурье. Два вопроса. 1)Как получить массив анализируемых данных для wav файла....

Быстрое преобразование Фурье - C++
Помогите реализовать задачу. Дана волновая функция(6sin5pit), необходимо преобразовать её спектр с помощью быстрого преобразования Фурье....

Быстрое Преобразование Фурье - C++
В качестве библиотеки взял хваленую IPP, и тут возник рад вопросов, вот код: packageSize = 4096; ...

Обратное быстрое преобразование Фурье - C++
Прямое преобразование работает корректно, а вот обратное возвращает странную дугу в независимсти от исходного сигнала. &quot;Не быстрый&quot;...

Быстрое преобразование Фурье по составному основанию - C++
Написал быстрое преобразование Фурье по составному основанию. Не запускается, выдает ошибку: &quot;Debug Error! Run-Time Check Failure #2...

Быстрое преобразование фурье wave файла - C++
Всем доброго времени суток! Сейчас работаю над дипломом, в c++ как и в обработке звука пока новичок. На данном этапе мне необходимо...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
wtf?
19 / 19 / 0
Регистрация: 03.10.2010
Сообщений: 48
12.11.2012, 20:19 #2
Первый вариант будет быстрее. Да и во втором если а = 0 вылетит assert..
Можешь 1-ый вариант вот так записать:
a = a?1:-1;
1
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
12.11.2012, 20:43 #3
Быстрее всего: ассемблерной вставкой. Загрузить, проверить на ноль, арифметический сдвиг вправо на 32 бита или какая там разрядность, логическое или с единичкой, вернуть значение.
1
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
12.11.2012, 20:49 #4
Цитата Сообщение от wtf? Посмотреть сообщение
Можешь 1-ый вариант вот так записать:
a = a?1:-1;
ну запиши, посмотри, что выйдет
1
The special one
13 / 13 / 0
Регистрация: 09.03.2012
Сообщений: 112
12.11.2012, 21:07  [ТС] #5
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Быстрее всего: ассемблерной вставкой. Загрузить, проверить на ноль, арифметический сдвиг вправо на 32 бита или какая там разрядность, логическое или с единичкой, вернуть значение.
Код можно привести? А то я новичок.
0
Thinker
Эксперт C++
4225 / 2199 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
12.11.2012, 21:18 #6
C++
1
   a = ((a > 0) << 1) - 1;
2
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
12.11.2012, 21:31 #7
Тоже вариант, но для нуля лажает. Есть ещё такой:
C++
1
a = (a > 0) - (a < 0);
И такой:
C++
1
a = ((a >> 31) | ((unsigned)(-a) >> 31));
А ещё лучше на забивать себе голову. Если ваш алгоритм и будет тормозить, то с вероятностью 95% виновником этого будет не эта функция (если только весь алгоритм не сводится к вычислению сигнума).
2
The special one
13 / 13 / 0
Регистрация: 09.03.2012
Сообщений: 112
12.11.2012, 22:09  [ТС] #8
Спасибо друзья! Вот решил время засекать.
C++
1
2
3
4
5
6
7
unsigned __int64 st1 = GetCycleCount();//Засекаем время
int a = -5248;
for(int i=0;i<999;i++){
    if(a > 0)a = 1;
    if(a < 0)a = -1;
}
raz1 = GetCycleCount() - st1;//Количество тактов
raz1 = 3047
C++
1
2
3
4
5
6
unsigned __int64 st1 = GetCycleCount();//Засекаем время
int a = -5248;
for(int i=0;i<999;i++){
    if(a > 0){a = 1;}else{a = -1;}
}
raz1 = GetCycleCount() - st1;//Количество тактов
raz1 = 4519
C++
1
2
3
4
5
6
7
8
unsigned __int64 st1 = GetCycleCount();//Засекаем время
int a = -5248;
for(int i=0;i<999;i++){
    a = a/abs(a);
    a = ((a > 0) << 1) - 1;
    a = (a > 0) - (a < 0);
}
raz1 = GetCycleCount() - st1;//Количество тактов
raz1 = 35
C++
1
2
3
4
5
6
unsigned __int64 st1 = GetCycleCount();//Засекаем время
int a = -5248;
for(int i=0;i<999;i++){
    
}
raz1 = GetCycleCount() - st1;//Количество тактов
raz1 = 35

Способы
a = a/abs(a);
a = ((a > 0) << 1) - 1;
a = (a > 0) - (a < 0);
работают намного быстрее, чем ифы. Даже если элс ифы заменить ифами, то тоже можно повысить быстродействие, если я правильно время засекаю.
0
Croessmah
Эксперт CЭксперт С++
13205 / 7476 / 839
Регистрация: 27.09.2012
Сообщений: 18,379
Записей в блоге: 3
Завершенные тесты: 1
12.11.2012, 22:31 #9
C++
1
2
3
4
5
6
unsigned __int64 st1 = GetCycleCount();//Засекаем время
int a = -5248;
for(int i=0;i<999;i++){
    
}
raz1 = GetCycleCount() - st1;//Количество тактов
Пустой цикл работать будет быстрее
1
The special one
13 / 13 / 0
Регистрация: 09.03.2012
Сообщений: 112
12.11.2012, 23:10  [ТС] #10
Цитата Сообщение от Croessmah Посмотреть сообщение
Пустой цикл работать будет быстрее
Я тоже так думаю, но у меня такие результаты. Запустите у себя на компах этот код и проверьте, если не трудно.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.11.2012, 23:10
Привет! Вот еще темы с ответами:

Необходимо написать быстрое рекурсивное умножение многочленов (полиномов). Не преобразование Фурье - C++
Необходимо написать быстрое рекурсивное умножения многочленов (полиномов). Не преобразование Фурье. Многочлен разбивается на две части (от...

Быстрое округление числа - C++
Здравствуйте уважаемые программисты! Подскажите как быстрее всего округлить число? double a = 4.78531 необходимо получить a = 4.80000...

Быстрое нахождение максимального делителя числа - C++
Всем привет! Столкнулся с такой проблемой, у меня дано число n \leq 10 ^ 18. Для использования моего алгоритма, мне нужно быстро найти...

Быстрое нахождение количества делителей натурального числа - C++
Как многие успели убедиться, часто требуется найти количество делителей натурального числа. Предлагаю быстрые алгоритмы для этой задачи. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
12.11.2012, 23:10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru