Проблема с выводом данных и определением типом данных, не сходятся ответы при проверке
у меня есть код, который выводит приближенный факториал по формуле стирлинга и рамануджана.
но проверка выдает ошибку:
что должно вывестись при 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 шт):
не ищите ошибку там где ее нет
возьмите обычный калькулятор в 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);