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

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

Войти
Регистрация
Восстановить пароль
 
GoldenId
89 / 130 / 32
Регистрация: 11.11.2010
Сообщений: 770
Записей в блоге: 14
Завершенные тесты: 1
#1

Оптимизирует ли компилятор деление/умножение double? - C++

25.04.2017, 06:24. Просмотров 266. Ответов 12
Метки нет (Все метки)

Если я пишу
C++
1
2
3
double d = ...;
for( ...; ...; d *= 2 )
    ...
или
C++
1
2
for( ...; ...; d /= 2 )
    ...
будет ли компилятор оптимизировать деление и умножение d, или для наилучшего результата нужно засучивать рукава и браться за мантиссу и экспоненту?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.04.2017, 06:24
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Оптимизирует ли компилятор деление/умножение double? (C++):

Оптимизирует ли компилятор код при использовании функции, возвращающей константу? - C++
Объясните мне компиляторы С++ оптимизируют такой код?. Да и вообще компиляторы оптимизуруют это? Я просто думал, что сохраняется адрес...

Умножение и деление - C++
Представьте себе числовой массив первым элементом равным begin. Если далее к нему мы будем прибавлять step пока не достигнем end то...

Чем заменить умножение и деление? - C++
Пожалуйста, подскажите, как выполнить следующие действия в С++, не используя умножениe и деление. Напишите программу, вычисляющую...

Умножение и деление целого числа - C++
1. Напишите программу, в которой умножение и деление целого числа на {2}^{n} реализуется при помощи логических сдвигов.

Вычитание, умножение, деление столбиком - C++
дано мне в классе 2 числа представленные в виде массивов. вот..для них у меня должны быть перегрузки операций сложения,вычитания,умножения...

Нестандартное сложение, вычитание, умножение и деление - C++
Что-то на форуме скучно, давайте устроим небольшой интерактивчик, придумываем самые нестандартные способы сложения, вычитания, умножения и...

12
nmcf
6197 / 5508 / 1929
Регистрация: 14.04.2014
Сообщений: 23,121
25.04.2017, 09:40 #2
Что за наилучший результат?
0
h3mbr0
290 / 100 / 25
Регистрация: 12.03.2012
Сообщений: 407
25.04.2017, 10:28 #3
Вопрос некорректный без указания компилятора и настроек оптимизации
Сравните скорости выполнения
Вполне вероятно, что для двойки оптимизация будет, а для степени двойки - уже нет
0
GoldenId
89 / 130 / 32
Регистрация: 11.11.2010
Сообщений: 770
Записей в блоге: 14
Завершенные тесты: 1
25.04.2017, 10:57  [ТС] #4
nmcf, если в качестве альтернативы я выделяю экспоненту, прибавляю к ней (вычитаю из неё) единицу и записываю обратно.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7800 / 4844 / 754
Регистрация: 29.11.2010
Сообщений: 13,210
25.04.2017, 11:13 #5
Для счётчиков цикла лучше использовать целые числа.
0
GoldenId
89 / 130 / 32
Регистрация: 11.11.2010
Сообщений: 770
Записей в блоге: 14
Завершенные тесты: 1
25.04.2017, 11:22  [ТС] #6
Увы мне нужен именно double. Его потом прибавлять к double-у же. Такое задание.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7800 / 4844 / 754
Регистрация: 29.11.2010
Сообщений: 13,210
25.04.2017, 11:50 #7
Цитата Сообщение от GoldenId Посмотреть сообщение
Его потом прибавлять к double-у же. Такое задание.
double + int вполне хорошо работает.
0
GoldenId
89 / 130 / 32
Регистрация: 11.11.2010
Сообщений: 770
Записей в блоге: 14
Завершенные тесты: 1
25.04.2017, 12:02  [ТС] #8
Цитата Сообщение от MrGluck Посмотреть сообщение
double + int вполне хорошо работает.
нужно складывать дробные части. Я даже разобрася, как хранится double в памяти:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
signed long long int make_ll( double d )
{
    signed long long int& ll = *( signed long long int* )&d;
 
    signed long long int mantis =
        ( ll & 0xFFFFFFFFFFFFF ) | ( ( ll & 0x7FFFFFFFFFFFFFFF ) ? 0x10000000000000 : 0 );
    if( ll & 0x8000000000000000 )
        mantis = -mantis;
    signed long long int exp =
        ( ( ll & 0x7FF0000000000000 ) >> 52 ) - 0x3FF - 52;
//  int shf_exp = exp - 52;
    signed long long int intpart = ( exp >= 0 ) ? mantis << exp : mantis >> -exp;
 
    if( /*shf_*/exp >= 0 )
        return mantis << /*shf_*/exp;
    else
        return mantis >> -exp;
//  return
//      ( ( ull & 0xFFFFFFFFFFFFF ) | ( ( ull & 0x8FFFFFFFFFFFFFFF ) ? 0x10000000000000 : 0 ) )
//      << ( ( ( ull & 0x7FF0000000000000 ) >> 52 ) - 0x3FF - 52 );
}
0
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,295
Записей в блоге: 2
Завершенные тесты: 1
25.04.2017, 12:07 #9
Цитата Сообщение от GoldenId Посмотреть сообщение
оптимизировать деление и умножение d
Что именно ты имеешь ввиду?
Цитата Сообщение от GoldenId Посмотреть сообщение
for( ...; ...; d *= 2 )
GCC может заменить умножение на 2 через сложение
0
GoldenId
89 / 130 / 32
Регистрация: 11.11.2010
Сообщений: 770
Записей в блоге: 14
Завершенные тесты: 1
25.04.2017, 12:33  [ТС] #10
Dani, ну да, если умножение на 2 заменяется прибавлением 1 к экспоненте.
0
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,295
Записей в блоге: 2
Завершенные тесты: 1
25.04.2017, 13:12 #11
Как я уже упомянул,
Цитата Сообщение от Dani Посмотреть сообщение
GCC может заменить умножение на 2 через сложение
Но добавление 1 к экспоненте не будет быстрее, поэтому такая оптимизация не производится:
1) чтобы добавить 1 к экспоненте, нужно как-то получить доступ к ней напрямую (как это сделать быстро?)
2) для 0, INFINITY, NAN это не выполняется, что потребует дополнительных проверок. Итог - потеря времени
3) Денормализованные числа
0
GoldenId
89 / 130 / 32
Регистрация: 11.11.2010
Сообщений: 770
Записей в блоге: 14
Завершенные тесты: 1
25.04.2017, 16:11  [ТС] #12
Цитата Сообщение от Dani Посмотреть сообщение
1) чтобы добавить 1 к экспоненте, нужно как-то получить доступ к ней напрямую (как это сделать быстро?)
C++
1
2
3
double d = ...;
long long& ll = *( long long* ) &d;
long long exp = ( ( ll & 0x7FF0000000000000 ) >> 52 ) - 0x3FF;
Цитата Сообщение от Dani Посмотреть сообщение
2) для 0, INFINITY, NAN это не выполняется, что потребует дополнительных проверок. Итог - потеря времени
Мгм...

Цитата Сообщение от Dani Посмотреть сообщение
3) Денормализованные числа
У меня задание, использовать свой самописный класс в качестве целой части, а double в качестве дробной. Вы предлагаете мне реализовывать денормализованные числа на double? Тогда придётся самому писать сложение, вычитание, сравнения, которые уж точно будут не быстрее, чем встроенные...
0
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,295
Записей в блоге: 2
Завершенные тесты: 1
25.04.2017, 16:48 #13
Цитата Сообщение от GoldenId Посмотреть сообщение
( ( ll & 0x7FF0000000000000 ) >> 52 ) - 0x3FF
и это по-твоему быстрее, чем одна операция сложения?

Добавлено через 5 минут
Был вопрос
Цитата Сообщение от GoldenId Посмотреть сообщение
Оптимизирует ли компилятор деление/умножение double?
Есть денормализованные числа с которыми возникает проблема, если делать +1 на дабл. О них я упомянул.
Денормализованные числа (англ. denormalized numbers, subnormal numbers) — вид чисел с плавающей запятой, определенный в стандарте IEEE 754.
Цитата Сообщение от GoldenId Посмотреть сообщение
Вы предлагаете мне реализовывать денормализованные числа на double? Тогда придётся самому писать сложение, вычитание, сравнения, которые уж точно будут не быстрее, чем встроенные...
Я ничего не предлагаю, я отвечал на вопрос который выше.
0
25.04.2017, 16:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.04.2017, 16:48
Привет! Вот еще темы с ответами:

Умножение/деление длинных целых чисел из строк - C++
у кого есть код 'умножение и деление целых чисел из строк'? заранее спасибо Добавлено через 32 минуты или библиотека и функции

Сложение и вычитание, умножение и деление, сравнение сумм - C++
Уважаемые форумчане! помогите, пожалуйста, нужно написать программу для работы с устаревшей денежной системой Великобритании. В ней...

Ошибки error C2296: -: недопустимо, левый операнд имеет тип "double (__cdecl *)(double,double,double - C++
Думаю из-за polp #include&lt;iostream&gt; #include&lt;cmath&gt; #include&lt;cstdlib&gt; using namespace std; double polp(double af,double...

Сделать сложение, вычитание, умножение и деление длинных чисел - C++
В общем, задача такая, что надо сделать сложение, вычитание, умножение и деление длинных чисел. Сумму сделал, с вычитанием какая-то засада....


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

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