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

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

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

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

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

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

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

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
wtf?
19 / 19 / 0
Регистрация: 03.10.2010
Сообщений: 48
12.11.2012, 20:19     Быстрое преобразование числа #2
Первый вариант будет быстрее. Да и во втором если а = 0 вылетит assert..
Можешь 1-ый вариант вот так записать:
a = a?1:-1;
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
12.11.2012, 20:43     Быстрое преобразование числа #3
Быстрее всего: ассемблерной вставкой. Загрузить, проверить на ноль, арифметический сдвиг вправо на 32 бита или какая там разрядность, логическое или с единичкой, вернуть значение.
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
12.11.2012, 20:49     Быстрое преобразование числа #4
Цитата Сообщение от wtf? Посмотреть сообщение
Можешь 1-ый вариант вот так записать:
a = a?1:-1;
ну запиши, посмотри, что выйдет
The special one
13 / 13 / 0
Регистрация: 09.03.2012
Сообщений: 112
12.11.2012, 21:07  [ТС]     Быстрое преобразование числа #5
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Быстрее всего: ассемблерной вставкой. Загрузить, проверить на ноль, арифметический сдвиг вправо на 32 бита или какая там разрядность, логическое или с единичкой, вернуть значение.
Код можно привести? А то я новичок.
Thinker
Эксперт C++
4225 / 2199 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
12.11.2012, 21:18     Быстрое преобразование числа #6
C++
1
   a = ((a > 0) << 1) - 1;
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% виновником этого будет не эта функция (если только весь алгоритм не сводится к вычислению сигнума).
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);
работают намного быстрее, чем ифы. Даже если элс ифы заменить ифами, то тоже можно повысить быстродействие, если я правильно время засекаю.
Croessmah
Модератор
Эксперт CЭксперт С++
13052 / 7315 / 814
Регистрация: 27.09.2012
Сообщений: 18,052
Записей в блоге: 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;//Количество тактов
Пустой цикл работать будет быстрее
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.11.2012, 23:10     Быстрое преобразование числа
Еще ссылки по теме:

Преобразование в числа - C++
Добрый день! Подскажите пожалуйста, как можно сделать.. В функцию передается строка - fun(&quot;1/4&quot;) {...} Как можно получить отдельно...

Преобразование числа - C++
Дано натуральное число. От этого числа отнимем суму его цыфр. От нового числа опять отнимем суму его цыфр. Так будем делать до тех пор,...

Преобразование символов в числа - C++
Дан текст, имеющий вид: dl + d2 + ... + dn, где di — цифры. Вычислить записанную в тексте сумму. Долго ломаю голову но выходит фигня....

Преобразование числа в символ. - C++
Здравствуйте, пишу программу перевода числа из Р-ичной системы счисления в Q-ичную. Столкнулся с такой вот проблемкой... При Q&lt;10 все...

Преобразование числа в строку - C++
Подскажите как преобразовать число в строку, пожалуйста!


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

Или воспользуйтесь поиском по форуму:
The special one
13 / 13 / 0
Регистрация: 09.03.2012
Сообщений: 112
12.11.2012, 23:10  [ТС]     Быстрое преобразование числа #10
Цитата Сообщение от Croessmah Посмотреть сообщение
Пустой цикл работать будет быстрее
Я тоже так думаю, но у меня такие результаты. Запустите у себя на компах этот код и проверьте, если не трудно.
Yandex
Объявления
12.11.2012, 23:10     Быстрое преобразование числа
Ответ Создать тему
Опции темы

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