>> Верное значение — 0,25 * 10^-40. Между прочим, это значительно больше, чем double.MIN_VALUE.
Да, но 10^20 в квадрате уже больше, чем может поместиться в double. Вы прекрасно понимаете, что как раз в этом примере точности double недостаточно для вычисления «в лоб» без предварительного преобразования выражений. Функтор, полученный с помощью моего кода, соответствует корректному математическому выражению для вычисления производной. То, что его надо упростить, а затем преобразовать для снижения погрешностей вычисления — это уже отдельная задача. Задача далеко не тривиальная и может послужить темой целой книги, а не поста на Хабре. Мой же пост был посвящен одному из вариантов применения шаблонов С++.
Я думаю, что не имеет смысла рассматривать абстрактные страны с равномерным распределением населения по всей территории. Не имеет смысла строить базовые станции там, где нет абонентов. Для примера можно взять Тюменской область, которую уже упоминали. Я понимаю, что расходы на создание и поддержание сети, покрывающую всю Тюменскую область, крайне высоки. Но я сильно сомневаюсь, что там существует 100% покрытие сети. В особенности там, где не добывают нефть :) К тому же там, где абонентов мало, можно использовать оборудование попроще, канал связи поуже и т.д. Вы когда-нибудь ездили на поезде по Сибири? Если да, то как Вы оцениваете качество мобильной связи в дали от больших городов и ж/д станций?
Непосредственно функтор, соответствующий аналитическому выражению производной, вычисляется в компайл-тайме. А вот в этом коде в компайл-тайме будут вычислены и конкретные цифры:
const auto func = Sqr(X) * Sqrt(X);
const auto d_func = derivative(func);
const double d_func_value = d_func(1);
Конечно, для этого придется добавить модификатор const к оператору «скобочки», а также к методу expression(). Да, это я не учел. Но модифицированный код работает и вычисляет производную на этапе компиляции.
А как зависит количество денег, необходимое на строительство и поддержание инфраструктуры по всей территории, от наличия/отсутствия роуминга внутри страны?
В соответствии с вашей логикой, практически любой язык позволяет получить что угодно в рантайме. Процесс реализации конкретных идей с помощью имеющегося инструментария языка от этого не становится менее интересным.
Цель поста — показать, что с помощью шаблонов на С++ в принципе можно обрабатывать несложные математические формулы. Например, дифференцировать. Я ни в коем случае не собирался делать собственную систему компьютерной алгебры. Вы можете обратить внимание на название библиотеки — CrazyMath :) Разве это подходящее имя для системы компьютерной алгебры?
Оптимизации простенькие я делал, но они были направлены против практически экспоненциального роста сложности вычисления производных высших порядков. Уже при вычислении производной 3-го порядка с помощью неоптимизированного кода мой компилятор (VC++ 2010) крепко задумывался. Упрощение выражений — безусловно очень сложная задача. Но я считаю, что ее следует рассматривать отдельно. Можно попытаться написать что-то вроде template class Simplify;
Вообще-то функция derivative выводит аналитическое выражение для производной. Приближенное вычисление используется только в случае дифференцирования произвольного функтора или лямбда-выражения.
Вот если бы оно умело какие-нибудь простейшие преобразования типа a — a = 0, a + 0 = a, a * (b + c) = a * c + b * c. Коли речь зашла о производных, то было бы полезно выводить производные элементарных функций, а не пытаться их аппроксимировать, да еще и не очень точно.
Блин, случайно ентер нажал, да еще и в не той раскладке :(
Совсем необязательно захватывать весь стек. Можно захватывать отдельные переменные — в VS 2010 это вполне работает
Можно еще Рихтера упомянуть. Он в самом начале своей книги приводит реализацию функции сообщений об ошибках. А еще в Visual Studio можно в Watch добавить переменную
@err,hr
— она будет показывать код последней ошибки и сообщение. Об этом тоже можно почитать у Рихтера.
Если в двоичной системе, но уже посчитанное (есть все разряды), то это тоже можно считать готовым к выводу — в шестнадцатеричном виде. Десятичное представление нужно только для человека, но человек все равно не в состоянии даже охватить взглядом число такой величины.
Да, но 10^20 в квадрате уже больше, чем может поместиться в double. Вы прекрасно понимаете, что как раз в этом примере точности double недостаточно для вычисления «в лоб» без предварительного преобразования выражений. Функтор, полученный с помощью моего кода, соответствует корректному математическому выражению для вычисления производной. То, что его надо упростить, а затем преобразовать для снижения погрешностей вычисления — это уже отдельная задача. Задача далеко не тривиальная и может послужить темой целой книги, а не поста на Хабре. Мой же пост был посвящен одному из вариантов применения шаблонов С++.
Конечно, для этого придется добавить модификатор const к оператору «скобочки», а также к методу expression(). Да, это я не учел. Но модифицированный код работает и вычисляет производную на этапе компиляции.
Оптимизации простенькие я делал, но они были направлены против практически экспоненциального роста сложности вычисления производных высших порядков. Уже при вычислении производной 3-го порядка с помощью неоптимизированного кода мой компилятор (VC++ 2010) крепко задумывался. Упрощение выражений — безусловно очень сложная задача. Но я считаю, что ее следует рассматривать отдельно. Можно попытаться написать что-то вроде template class Simplify;
В качестве первого приближения вполне сгодится. К тому же это просто заглушка.
Ссылка на стек становится невалидной. А что произойдет с лямбдой и захваченной переменной?
Совсем необязательно захватывать весь стек. Можно захватывать отдельные переменные — в VS 2010 это вполне работает