#include <boost/math/special_functions/ellint_d.hpp>
namespace boost { namespace math {
template <class T1, class T2>
calculated-result-type ellint_d(T1 k, T2 phi);
template <class T1, class T2, class Policy>
calculated-result-type ellint_d(T1 k, T2 phi, const Policy&);
template <class T1>
calculated-result-type ellint_d(T1 k);
template <class T1, class Policy>
calculated-result-type ellint_d(T1 k, const Policy&);
}} 
Эти две функции оценивают неполный эллиптический интеграл D(φ, k) и его полный аналог D(k) = D(π/2, k).
Тип возврата этих функций вычисляется с помощью правил __arg_pomotion_, когда аргументы имеют разные типы: когда они одинаковый тип, то результат такой же тип, как и аргументы.
template <class T1, class T2>
calculated-result-type ellint_d(T1 k, T2 phi);
template <class T1, class T2, class Policy>
calculated-result-type ellint_3(T1 k, T2 phi, const Policy&);
Возвращает неполный эллиптический интеграл:

Требуется -1 <= k <=1, в противном случае возвращается результат domain_error (за пределами этого диапазона результат будет сложным).
Окончательный аргумент Политика является необязательным и может использоваться для контроля поведения функции: как он обрабатывает ошибки, какой уровень точности использовать и т.д. См. документ политики для более подробной информации.
template <class T1>
calculated-result-type ellint_d(T1 k);
template <class T1, class Policy>
calculated-result-type ellint_d(T1 k, const Policy&);
Возвращает полный эллиптический интеграл D(k) = D(π/2, k)
Требование -1 <= k <=1 в противном случае возвращает результат domain_error (за пределами этого диапазона результат будет сложным).
Окончательный аргумент Политика является необязательным и может использоваться для контроля поведения функции: как он обрабатывает ошибки, какой уровень точности использовать и т.д. См. документ политики для более подробной информации.
Эти функции тривиально вычислены с точки зрения других эллиптических интегралов и, как правило, имеют очень низкие показатели ошибок (несколько эпсилонов), если параметр φ не является очень большим, в этом случае применяются обычные тригонометрические проблемы снижения аргументов.
Table 6.66. Error rates for ellint_d (complete)
| 
               | 
                 Microsoft Visual C++ версии 12.0  Win32  двойной 
               | 
                 GNU C++ версия 5.1.0  linux  двойной 
               | 
                 GNU C++ версия 5.1.0  linux  длинный двойной 
               | 
                 Солнечная компиляторная версия 0x5130  Sun Solaris  длинный двойной 
               | 
 Elliptic Integral E: Mathworld Data   | 
 Max = 0,637ε (Mean = 0,368ε)   | 
 Max = 0,637ε (Mean = 0,368ε)   | 
 Max = 1,27ε (Mean = 0,735ε)   | 
 Max = 1,27ε (Mean = 0,735ε)   | 
 Elliptic Integral D: Случайные данные   | 
 Max = 1,27ε (Mean = 0,355ε)   | 
 Max = 0ε (Mean = 0ε)   | 
 Max = 1,27ε (Mean = 0,334ε)   | 
 Max = 1,27ε (Mean = 0,334ε)   | 
 
 
Table 6.67. Error rates for ellint_d
| 
               | 
                 Microsoft Visual C++ версии 12.0  Win32  двойной 
               | 
                 GNU C++ версия 5.1.0  linux  двойной 
               | 
                 GNU C++ версия 5.1.0  linux  длинный двойной 
               | 
                 Солнечная компиляторная версия 0x5130  Sun Solaris  длинный двойной 
               | 
 Elliptic Integral E: Mathworld Data   | 
 Max = 0,862ε (Mean = 0,457ε)   | 
 Max = 0ε (Mean = 0ε)    (GSL 1.16: Max = 0.862ε (Mean = 0.568&949;)   | 
 Max = 1,3ε (Mean = 0,813ε)   | 
 Max = 1,3ε (Mean = 0,813ε)   | 
 Elliptic Integral D: Случайные данные   | 
 Max = 2,87ε (Mean = 0,805ε)   | 
 Max = 0ε (Mean = 0ε)    (GSL 1.16: Max = 3.01ε (Mean = 0.928ε)   | 
 Max = 2,51ε (Mean = 0,883ε)   | 
 Max = 2,51ε (Mean = 0,883ε)   | 
 
 
Испытания используют смесь спотовых тестовых значений, рассчитанных с использованием значений, рассчитанных на wolframalpha.com, и случайных тестовых данных, полученных с использованием MPFR с 1000-битной точностью, и преднамеренно наивной реализации с точки зрения интегралов Legendre.
Реализация D(φ, k) сначала выполняет снижение аргументов, используя отношения:
D(-φ, k) = -D(φ, k)
и
D(nπ+φ, k) = 2nD(k) + D(φ, k)
to move φ   to the range [0, π/2].
Функции затем реализуются с точки зрения интегрального RD Карлсона, используя отношение:
