public static class MathExtensions
{
    public static double Pow(this double x, int n)
    {
        if (n == 0) return 1.0;
        if (n == 1) return x;
        return Math.Pow(x, n);
    }
    
    public static T Pow<T>(this NumberAdapter<T> adapter, int n) 
        where T : struct
    {
        if (n == 0) return adapter.One;
        if (n == 1) return adapter.Value;
        T result = adapter.One;
        for (int i = 0; i < n; i++)
            result = adapter.Multiply(result, adapter.Value);
        return result;
    }
}

Субнормальные числа (Subnormal / Denormal numbers)Когда double подбирается к абсолютного нулю (меньше $2.22 \times 10^{-308}$), он начинает терять биты мантиссы (постепенное подпороговое затопление / gradual underflow).Что делать в тесте: Подайте на вход вашей геодезической формулы микроскопические разности широт/долгот ($\approx 10^{-310}$).Результат double: Потеряет точность с 53 бит до 2–3 бит, а потом резко свалится в абсолютный $0.0$, убив всю производную!Результат BigDecimal: Спокойно продолжит считать с заданной точностью хоть до $10^{-1000}$.Б. Катастрофическое гашение (Catastrophic Cancellation)Это вычитание двух почти равных double чисел.Пример: Если вы из $1.0000000000000002$ вычтете $1.0000000000000000$, у вас останется всего 1 значимый бит вместо 53!В геодезии: При расчете малых расстояний между близкими точками ($B_2 - B_1$), если координаты хранить в абсолютных радианах/градусах, double «съест» всю точность на разности больших чисел, а BigDecimal оставит все 30+ знаков после запятой.В. Игры с BitIncrement / BitDecrementВ .NET 8 есть отличные функции: Math.BitIncrement(x) и Math.BitDecrement(x). Они сдвигают double на ровно 1 ULP (Unit in the Last Place — минимально возможный шаг float-числа).Как сломать алгоритм:Возьмите ключевой коэффициент (например, $C_0$) или входной параметр $B$, сделайте Math.BitIncrement(x) и посмотрите на производную/невязку. Из-за нелинейности ряда Тейлора изменение на 1 младший бит в double на определенных границах диапазона может вызвать «скачок» невязки, в то время как BigDecimal покажет абсолютно гладкую физическую функцию!🚀 План действий для .NET 8Чтобы устроить double жесткий краш-тест, добавьте в бенчмарк тест с эквивалентом «исследования микро-окрестности»:



public static T Sin<T>(this NumberAdapter<T> adapter, T value) 
    where T : struct
{
    return adapter.Sin(value);
}