All streams
Search
Write a publication
Pull to refresh
31
0
Алексей @alexeibs

Пользователь

Send message
>> Верное значение — 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(). Да, это я не учел. Но модифицированный код работает и вычисляет производную на этапе компиляции.
А как зависит количество денег, необходимое на строительство и поддержание инфраструктуры по всей территории, от наличия/отсутствия роуминга внутри страны?
Численность абонентов определяет нагрузку на инфраструктуру сети.
Возможно, имеет смысл сравнивать число абонентов? При всех ее размерах население России лишь в 3 раза больше, чем Украина.
В соответствии с вашей логикой, практически любой язык позволяет получить что угодно в рантайме. Процесс реализации конкретных идей с помощью имеющегося инструментария языка от этого не становится менее интересным.
Цель поста — показать, что с помощью шаблонов на С++ в принципе можно обрабатывать несложные математические формулы. Например, дифференцировать. Я ни в коем случае не собирался делать собственную систему компьютерной алгебры. Вы можете обратить внимание на название библиотеки — CrazyMath :) Разве это подходящее имя для системы компьютерной алгебры?
Оптимизации простенькие я делал, но они были направлены против практически экспоненциального роста сложности вычисления производных высших порядков. Уже при вычислении производной 3-го порядка с помощью неоптимизированного кода мой компилятор (VC++ 2010) крепко задумывался. Упрощение выражений — безусловно очень сложная задача. Но я считаю, что ее следует рассматривать отдельно. Можно попытаться написать что-то вроде template class Simplify;
Вообще-то функция derivative выводит аналитическое выражение для производной. Приближенное вычисление используется только в случае дифференцирования произвольного функтора или лямбда-выражения.
Потому что проще в реализации.
Там опечатка:
double operator()(double x)  { return (m_f(x + m_dx) - m_f(x)) / m_dx; }

В качестве первого приближения вполне сгодится. К тому же это просто заглушка.
Проекта никакого нет. Просто после прочтения статьи показалось интересной идея выведения точного выражения для производной с помощью шаблонов.
Вот если бы оно умело какие-нибудь простейшие преобразования типа a — a = 0, a + 0 = a, a * (b + c) = a * c + b * c. Коли речь зашла о производных, то было бы полезно выводить производные элементарных функций, а не пытаться их аппроксимировать, да еще и не очень точно.
А что произойдет в этом коде, после того, как мы выйдем из функции getFunction?
std::function<int()> getFunction()
{
    int n = 10;
    std::function<int()> result = [&n]()
    {
        return n;
    }
    return result;
}

Ссылка на стек становится невалидной. А что произойдет с лямбдой и захваченной переменной?
Блин, случайно ентер нажал, да еще и в не той раскладке :(
Совсем необязательно захватывать весь стек. Можно захватывать отдельные переменные — в VS 2010 это вполне работает
Можно еще Рихтера упомянуть. Он в самом начале своей книги приводит реализацию функции сообщений об ошибках. А еще в Visual Studio можно в Watch добавить переменную
@err,hr
— она будет показывать код последней ошибки и сообщение. Об этом тоже можно почитать у Рихтера.
В Visual Studio 2010, который используется автором статьи, std::bind есть.
Если в двоичной системе, но уже посчитанное (есть все разряды), то это тоже можно считать готовым к выводу — в шестнадцатеричном виде. Десятичное представление нужно только для человека, но человек все равно не в состоянии даже охватить взглядом число такой величины.

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Registered
Activity