Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
 Аватар для GoldenId
142 / 143 / 64
Регистрация: 11.11.2010
Сообщений: 877
Записей в блоге: 10

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

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

Студворк — интернет-сервис помощи студентам
Если я пишу
C++
1
2
3
double d = ...;
for( ...; ...; d *= 2 )
    ...
или
C++
1
2
for( ...; ...; d /= 2 )
    ...
будет ли компилятор оптимизировать деление и умножение d, или для наилучшего результата нужно засучивать рукава и браться за мантиссу и экспоненту?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.04.2017, 06:24
Ответы с готовыми решениями:

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

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

Деление типов float double
#include "pch.h" #include <iostream> #include "math.h" int main() { enum Names {Maxim, Olga, Alex, Yulia, Oleg, Kate, Serg };...

12
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
25.04.2017, 09:40
Что за наилучший результат?
0
298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449
25.04.2017, 10:28
Вопрос некорректный без указания компилятора и настроек оптимизации
Сравните скорости выполнения
Вполне вероятно, что для двойки оптимизация будет, а для степени двойки - уже нет
0
 Аватар для GoldenId
142 / 143 / 64
Регистрация: 11.11.2010
Сообщений: 877
Записей в блоге: 10
25.04.2017, 10:57  [ТС]
nmcf, если в качестве альтернативы я выделяю экспоненту, прибавляю к ней (вычитаю из неё) единицу и записываю обратно.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
25.04.2017, 11:13
Для счётчиков цикла лучше использовать целые числа.
0
 Аватар для GoldenId
142 / 143 / 64
Регистрация: 11.11.2010
Сообщений: 877
Записей в блоге: 10
25.04.2017, 11:22  [ТС]
Увы мне нужен именно double. Его потом прибавлять к double-у же. Такое задание.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
25.04.2017, 11:50
Цитата Сообщение от GoldenId Посмотреть сообщение
Его потом прибавлять к double-у же. Такое задание.
double + int вполне хорошо работает.
0
 Аватар для GoldenId
142 / 143 / 64
Регистрация: 11.11.2010
Сообщений: 877
Записей в блоге: 10
25.04.2017, 12:02  [ТС]
Цитата Сообщение от 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
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
25.04.2017, 12:07
Цитата Сообщение от GoldenId Посмотреть сообщение
оптимизировать деление и умножение d
Что именно ты имеешь ввиду?
Цитата Сообщение от GoldenId Посмотреть сообщение
for( ...; ...; d *= 2 )
GCC может заменить умножение на 2 через сложение
0
 Аватар для GoldenId
142 / 143 / 64
Регистрация: 11.11.2010
Сообщений: 877
Записей в блоге: 10
25.04.2017, 12:33  [ТС]
Dani, ну да, если умножение на 2 заменяется прибавлением 1 к экспоненте.
0
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
25.04.2017, 13:12
Как я уже упомянул,
Цитата Сообщение от Dani Посмотреть сообщение
GCC может заменить умножение на 2 через сложение
Но добавление 1 к экспоненте не будет быстрее, поэтому такая оптимизация не производится:
1) чтобы добавить 1 к экспоненте, нужно как-то получить доступ к ней напрямую (как это сделать быстро?)
2) для 0, INFINITY, NAN это не выполняется, что потребует дополнительных проверок. Итог - потеря времени
3) Денормализованные числа
0
 Аватар для GoldenId
142 / 143 / 64
Регистрация: 11.11.2010
Сообщений: 877
Записей в блоге: 10
25.04.2017, 16:11  [ТС]
Цитата Сообщение от 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
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
25.04.2017, 16:48
Цитата Сообщение от GoldenId Посмотреть сообщение
( ( ll & 0x7FF0000000000000 ) >> 52 ) - 0x3FF
и это по-твоему быстрее, чем одна операция сложения?

Добавлено через 5 минут
Был вопрос
Цитата Сообщение от GoldenId Посмотреть сообщение
Оптимизирует ли компилятор деление/умножение double?
Есть денормализованные числа с которыми возникает проблема, если делать +1 на дабл. О них я упомянул.
Денормализованные числа (англ. denormalized numbers, subnormal numbers) — вид чисел с плавающей запятой, определенный в стандарте IEEE 754.
Цитата Сообщение от GoldenId Посмотреть сообщение
Вы предлагаете мне реализовывать денормализованные числа на double? Тогда придётся самому писать сложение, вычитание, сравнения, которые уж точно будут не быстрее, чем встроенные...
Я ничего не предлагаю, я отвечал на вопрос который выше.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.04.2017, 16:48
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru