Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
GoldenId
131 / 130 / 64
Регистрация: 11.11.2010
Сообщений: 770
Записей в блоге: 14
Завершенные тесты: 1
#1

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

25.04.2017, 06:24. Просмотров 296. Ответов 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
Ответы с готовыми решениями:

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

Умножение и деление
Представьте себе числовой массив первым элементом равным begin. Если далее к...

Вычитание, умножение, деление столбиком
дано мне в классе 2 числа представленные в виде массивов. вот..для них у меня...

Чем заменить умножение и деление?
Пожалуйста, подскажите, как выполнить следующие действия в С++, не используя...

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

12
nmcf
6271 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
25.04.2017, 09:40 #2
Что за наилучший результат?
0
h3mbr0
294 / 104 / 30
Регистрация: 12.03.2012
Сообщений: 419
25.04.2017, 10:28 #3
Вопрос некорректный без указания компилятора и настроек оптимизации
Сравните скорости выполнения
Вполне вероятно, что для двойки оптимизация будет, а для степени двойки - уже нет
0
GoldenId
131 / 130 / 64
Регистрация: 11.11.2010
Сообщений: 770
Записей в блоге: 14
Завершенные тесты: 1
25.04.2017, 10:57  [ТС] #4
nmcf, если в качестве альтернативы я выделяю экспоненту, прибавляю к ней (вычитаю из неё) единицу и записываю обратно.
0
MrGluck
Модератор
Эксперт CЭксперт С++
8078 / 4930 / 1431
Регистрация: 29.11.2010
Сообщений: 13,357
25.04.2017, 11:13 #5
Для счётчиков цикла лучше использовать целые числа.
0
GoldenId
131 / 130 / 64
Регистрация: 11.11.2010
Сообщений: 770
Записей в блоге: 14
Завершенные тесты: 1
25.04.2017, 11:22  [ТС] #6
Увы мне нужен именно double. Его потом прибавлять к double-у же. Такое задание.
0
MrGluck
Модератор
Эксперт CЭксперт С++
8078 / 4930 / 1431
Регистрация: 29.11.2010
Сообщений: 13,357
25.04.2017, 11:50 #7
Цитата Сообщение от GoldenId Посмотреть сообщение
Его потом прибавлять к double-у же. Такое задание.
double + int вполне хорошо работает.
0
GoldenId
131 / 130 / 64
Регистрация: 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 / 134
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
Завершенные тесты: 1
25.04.2017, 12:07 #9
Цитата Сообщение от GoldenId Посмотреть сообщение
оптимизировать деление и умножение d
Что именно ты имеешь ввиду?
Цитата Сообщение от GoldenId Посмотреть сообщение
for( ...; ...; d *= 2 )
GCC может заменить умножение на 2 через сложение
0
GoldenId
131 / 130 / 64
Регистрация: 11.11.2010
Сообщений: 770
Записей в блоге: 14
Завершенные тесты: 1
25.04.2017, 12:33  [ТС] #10
Dani, ну да, если умножение на 2 заменяется прибавлением 1 к экспоненте.
0
Dani
1393 / 637 / 134
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
Завершенные тесты: 1
25.04.2017, 13:12 #11
Как я уже упомянул,
Цитата Сообщение от Dani Посмотреть сообщение
GCC может заменить умножение на 2 через сложение
Но добавление 1 к экспоненте не будет быстрее, поэтому такая оптимизация не производится:
1) чтобы добавить 1 к экспоненте, нужно как-то получить доступ к ней напрямую (как это сделать быстро?)
2) для 0, INFINITY, NAN это не выполняется, что потребует дополнительных проверок. Итог - потеря времени
3) Денормализованные числа
0
GoldenId
131 / 130 / 64
Регистрация: 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 / 134
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 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

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

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

Умножение/деление длинных целых чисел из строк
у кого есть код 'умножение и деление целых чисел из строк'? заранее спасибо ...


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

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

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