Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602

Std::log2 и constexpr

31.12.2017, 12:26. Показов 2980. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я бы хотел прояснить пару моментов по std::log2.
1) Это constexpr функция? Выставил gcc ключ pedantic, вбил int test[(int)std::log2(1234)];, вроде работает, на VLA не ругается. Но на en.cppreference.com про constexpr ничего не нашел.
2) Гарантируется ли где либо что для степеней двойки эта функция возвращает точный результат? То есть, что std::log2(4) равно двум, а не 1.9999999999.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.12.2017, 12:26
Ответы с готовыми решениями:

Присваивание constexpr к non-constexpr
constexpr float pi = 3.14159265; void some_fun() { float angle = 45.0f*(pi/180.0f); std::cout << angle; } В консоли...

Не воспринимает ни std::cout, ни std::cin. Вобщем ничего из std. Также не понимает iostream
Здравствуйте! Я хотел начать изучать язык C++. Набрал литературы. Установил Microsoft Visual C++ 2005 Express Edition. Образ диска...

ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri
на вод поступают 2 строки типа string. определить количество вхождений строки 2 в строку 1 ошибка error: cannot convert 'std::string {aka...

7
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
31.12.2017, 12:32
gcc по умолчанию стандартные функции превращает в builtin'ы. std::log2 скорее всего содержит в себе вызов log2 из math.h, его gcc превратит в __builtin_log2, а затем сделает свёртку констант

Попробуй подать опцию -fno-builtin, это свойство отключится и скорее всего будет ошибка компиляции
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
31.12.2017, 13:02  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
Попробуй подать опцию -fno-builtin, это свойство отключится и скорее всего будет ошибка компиляции
g++ -pedantic -fno-builtin -std=c++11 test.cpp -o /dev/null
Никаких ошибок и варнингов. При том что если задать размер массива переменной, то как и положено плюнется варнингом.
C++
1
2
3
4
5
6
7
8
#include<cmath>
#include<iostream>
 
int main()
{
    int test[(int)std::log2(1234)]={0};
    std::cout<<test[0];
}
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
31.12.2017, 13:47
Так в этом тесте у тебя log2 используется в качестве размерности VLA-массива (конкретно в gcc). Для правильности построения теста массив нужно сделать глобальной переменной. Правда -fno-builtin по прежнему не помогает

Добавлено через 3 минуты
Если тест переписать так (тут важно, что константу подставил 512.0)

C++
#include <cmath>
 
char test[(int)std::log2(512.0)]={0};
int main()
{
  return 0;
}
Code
$ g++-5 -std=c++11 t.cc
<ok>
 
$ g++-5 -std=c++11 t.cc -fno-builtin
t.cc:4:32: error: array bound is not an integer constant before ']' token
 char test[(int)std::log2(512.0)]={0};
                                ^
Однако если константу оставить в виде "512", то падения нет. По правилам Си++ для "512.0" вызовется "double std::log2 (double)". А что вызовется для int'овой константы?

Добавлено через 8 минут
Наткнулся в /usr/include/c++/5/cmath на такую конструкцию

C++
  template<typename _Tp>
    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,.
                                              double>::__type
    log2(_Tp __x)
    { return __builtin_log2(__x); }
вероятно, для int'а используется именно это. Но -fno-builtin по логике должно было примениться
1
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
31.12.2017, 14:07  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
А что вызовется для int'овой константы?
double log2( Integral arg );
Хм, действительно, с double аргументом фокус не прокатывает.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
31.12.2017, 14:45
Лучший ответ Сообщение было отмечено Renji как решение

Решение

C++
#include <cmath>
 
extern double ddd;
extern int iii;
double qqqd = std::log2 (ddd);
double qqqi = std::log2 (iii);
Code
$ g++-5 -std=c++11 t.cc -S
 
$ cat t.s
...
_Z41__static_initialization_and_destruction_0ii:
...
        movq ddd(%rip), %rax
        movq %rax, -16(%rbp)
        movsd -16(%rbp), %xmm0
        call log2
        movq %xmm0, %rax
        movq %rax, qqqd(%rip)
...
        movl iii(%rip), %eax
        movl %eax, %edi
        call _ZSt4log2IiEN9__gnu_cxx11__enable_ifIXsrSt12__is_integerIT_E7__valueEdE6__typeES3_
        movq %xmm0, %rax
        movq %rax, qqqi(%rip)
...
Т.е. для double логарифм вычисляется через __builtin_log2, который в итоговом коде и раскрывается в вызов log2, на который влияет опция -fno-builtin. А вот для int'а используется функция, тела которой в хидерах нет. Вероятно, gcc с ней работает по отдельной ветке, опция -fno-builtin на эту ветку не влияет, возможно, что есть какая-то другая опция, которая влияет
1
322 / 174 / 78
Регистрация: 09.10.2014
Сообщений: 809
31.12.2017, 16:33
1. Поставь constexpr. Если скомпилится, что это будет гарантией, что функция constexpr.
C++
1
2
3
4
5
6
7
8
#include<cmath>
#include<iostream>
 
int main()
{
    constexpr auto test = std::log2(1234);
    std::cout << test ;
}
Добавлено через 2 минуты
В gcc - constexpr.
В vc++ (2015) - не constexpr.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
31.12.2017, 16:41
Цитата Сообщение от lArtl Посмотреть сообщение
Если скомпилится, что это будет гарантией, что функция constexpr
Я так понимаю, ТС хотел узнать как это выглядит с точки зрения стандарта. Просто всё переросло в "почему так на gcc"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.12.2017, 16:41
Помогаю со студенческими работами здесь

STL std::set, std::pair, std::make_pair
Я не знаю как описать тему в двух словах, поэтому не обращайте внимание на название темы. Собственно перейдем к нашим баранам: есть...

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же числа, но не в виде строк, а в виде...

Std::begin() ,std::end(),std::copy
...// int main() { std::vector&lt;double&gt; data;//Работает cout &lt;&lt; std::begin(data); double *data=new double; ...

Std::bind, std::mem_fun, std::mem_fn
В чем разница между функциями std::bind, std::mem_fun, std::mem_fn?

Constexpr
В программе внутри конструкции switch case, встретился с шибкой the value of 'str' is not usable in a constant expression


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru