Проблема с выводом данных и определением типом данных, не сходятся ответы при проверке

у меня есть код, который выводит приближенный факториал по формуле стирлинга и рамануджана.

но проверка выдает ошибку:
что должно вывестись при i = 6: 710.079 719.999

что выводится у меня: 710.078 719.998

предполагаю, что где-то в этом фрагменте ошибка, но я уже меняла на float и прочее, ответ всегда одинаковый, в чем может быть ошибка?

                    double  f1, f2;  
                    //тут кусок кода с циклом
                    f1 = sqrt(2.0 * M_PI * i)* pow((i / M_E),i);
                    printf("%.3f\t",f1);

                    f2 = sqrt(2.0 * M_PI * i) * pow((i / M_E), i) * pow((1.0 + (1.0/(2.0 * i))) + (1.0/(8.0 * (i * i))), 1.0 / 6.0);
                    printf("%.3f\n", f2);

Ответы (1 шт):

Автор решения: Zhihar

не ищите ошибку там где ее нет

возьмите обычный калькулятор в Windows (там побольше double числа) и вычислите:

формула Стирлинга: 710.07818464218477370752230400634

ваша программа: 710.07818464218497

отличия - 2e-13

тут точно никакого 710.079 быть не должно

P.S.

хотите получить те округлённые числа - работайте СТРОГО В АРИФМЕТИКЕ FLOAT

const float M_E = 2.71828182845904523536;
const float M_PI = 3.14159265358979323846;

const int i = 6;

float  f1, f2;
//тут кусок кода с циклом
f1 = sqrt(2.0f * M_PI * i) * pow(i / M_E, i);

printf("%.3f\t", f1);

f2 = sqrt(2.0f * M_PI * i) * pow(i / M_E, i) * pow((1.0f + (1.0f / (2.0f * i))) + (1.0f / (8.0f * (i * i))), 1.0f / 6.0f);
printf("%.3f\n", f2);

т.е. чтобы любые числа, в том числа и PI И E были небольшой точности, а также всякие деления и т.п.

P.P.S.

поигрался с числами - для достижения требуемого результата достаточно только пи и е сделать float, этой потери точности уже хватит для нужного результата

f1 = sqrt(2.0 * (float)M_PI * i) * pow(i / (float)M_E, i);
f2 = sqrt(2.0 * (float)M_PI * i) * pow(i / (float)M_E, i) * pow((1.0 + (1.0 / (2.0 * i))) + (1.0 / (8.0 * (i * i))), 1.0 / 6.0);
→ Ссылка