LINUX.ORG.RU

ANSI C++: вычисление дробной степени (SFINAE)

 , , , ,


0

2

Всем привет!

Подскажите пожалуйста, как в классическом C++ можно с помощью шаблонов, принципа SFINAE посчитать результат возведения положительного дробного числа в положительную дробную степень во время компиляции.

Общая идея:

a^x = exp(x * ln(a))

В свою очередь ln(a) можно разложить в ряд Тейлора:

ln(a + 1) = [ a / (1!) ] - [ a^2 / (2!) ] + [ a^3 / (3!) ] - ...

Экспонента тоже раскладывается в ряд Тейлора:

exp(p) = 1 + [ p / (1!) ] + [ p^2 / (2!) ] + [ p^3 / (3!) ] + ...

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

Собственно вопрос: подскажите как можно обойти это ограничение и таки посчитать a^x в compiletime.

★★★

Последнее исправление: zx_gamer (всего исправлений: 1)

Ответ на: комментарий от zx_gamer

В машинный код попадет только то, что будет использоваться.

Компилятор честно сгенерит все. Что сделает линкер, отдельный вопрос.

Не нужно. Реализация прописывается 1 раз для всех классов, реализующих интерфейс итераторов с линейным доступом.

Мда.

andreyu ★★★★★
()
Ответ на: комментарий от zx_gamer

C++ любой версии всегда был таким, и то что ты называешь ANSI C++ это какой последний стндарт? В 2012 году ISO сертифицировала 11 стандарт, так что он тоже ANSI, дальше тоже думаю сертификация шла и всё что выходит в течении года делается ANSI.

peregrine ★★★★★
()
Ответ на: комментарий от zx_gamer

Java тоже ненормальна - она слишком многословна, среди всех ЯП самые нормальные C# и Python (но с Python-ом всё интересно - если следовать PEP-ам всем ну или хотя бы основным то он нормальный, но так никто не делает как только код больше хелло ворлда потому как бы нет, от тех же сорцов pandas-а местами блевать тянет, хотя глянул на гитхабе стало лучше, было совсем плохо, теперь плохо местами).

peregrine ★★★★★
()
Ответ на: комментарий от zx_gamer

А что не так со вторым вариантом? my_vector.begin() и my_vector.end() это константы которые всегда только такие или всё же произвольные итераторы, которыми можно искать в куске std::vector?

peregrine ★★★★★
()
Ответ на: комментарий от soomrack

Простите, а что плюсы не ломают в плане обратной совместимости между версиями? Ломают и ещё как. Просто они настолько большие, что про многие вещи которые ломают разработчики на C++ даже не слышали. Хотя должны были бы.

peregrine ★★★★★
()
Ответ на: комментарий от AntonI

Хуже кода чем у браузеров это ещё поискать надо. Он на уровне кода от 70 летних математиков. Разумеется речь про движок, а причина простая - абстракции у движка на первый взгляд очень нелогичные, но на самом деле очень логичные, т.к. веб это про динамику которую js на лету меняет, но многие программисты которые туда впервые заглядывают или не заглядывали вовсе думают что там другие абстракции лежат.

peregrine ★★★★★
()
Ответ на: комментарий от AntonI

Основная претензия к геттерам/сеттерам (у нас) ухудшение читемости кода.

Это потому что для плюсов геттеры и сеттеры инородны и сахаром не присыпаны. В том же C# читаемость от них не падает (конечно если не в одну длинную строку код писать)

peregrine ★★★★★
()
Ответ на: комментарий от andreyu

Ну docking это скорее просто полезная фича. Большинство проектов перетащить на docking или обратно не проблема. А вот ImStrv потребует перепилить всю интеграцию чтобы его активно использовать, иначе придётся нулль-терминировать все строки при переходе на основную ветку

mittorn ★★★★★
()
Ответ на: комментарий от eao197

К сожалению API STL'овых контейнеров максимально убого выглядит. Можно наверно какие-то врапперы вкрутить, но замучаешься это делать. За и большого смысла нет подстраиваться под STLовые API если всё равно STL тащить в проект не планируется

mittorn ★★★★★
()
Ответ на: комментарий от peregrine

на уровне кода от 70 летних математиков

Пааапрашу! Или это был комплимент?:-) Я знаю коды от 70ти летних математиков которые до сих пор актуальны и вне конкуренции…

AntonI ★★★★★
()
Ответ на: комментарий от AntonI

Я видел как-то код на питоне от одних из самых уважаемых математиков учёных. Он мне уже лет 6 в кошмарах снится. Я думал что видел всё, но как же я был наивен. Ладно переменные однобуквенные, самое страшное не в этом, а в том что они свою систему экранирования юзерского ввода сделали (некорректно настолько, что можно произвольный код выполнить в ней и я думаю это «проверенное» решение которое обязательно используется где-то где данные через инет едут без шифрования/легко получить доступ).

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

Однобуквенные переменные для числодробилок это скорее правило чем исключение. Обозначения в коде должны совпадать с обозначениями в тексте описывающем численную схему.

Что касается экранирования польз.ввода - тут никак не могу прокомментировать. Скорее всего авторы ничего в вопросах безопасности не понимают и привыкли что пользователи - их коллеги, не злоумышляют.

AntonI ★★★★★
()