Тут вся хитрость в том, что для большИх положительных x сумму этого ряда просто так на компьютере при помощи чисел, представленных с ограниченной точностью, не вычислить, а надо действовать более тонко:
using System;
namespace MySpace
{
public static class Program
{
public static double f(double x)
{
if (x > 0) return 1.0 / f(-x);
double y = -x, sum = 1.0, product = sum, n = 0.0;
while (product / sum > 1e-18)
{
n += 1.0;
product *= y / n;
sum += product;
}
return sum;
}
public static void Main()
{
double x, y;
for (;;)
{
Console.Write("x » ");
x = double.Parse(Console.ReadLine());
y = f(x);
Console.WriteLine(y + ", err=" + (y/Math.Exp(-x)-1.0));
}
}
}
}
Вот так грамотно. В функции f(x)=e⁻ˣ мы просто сделали рекурсивный вызов чтобы программно обойти наиболее неприятный случай.
ВячеславМыслитель (9266)
1 год назад
Проверив работоспособность и корректность разработанной нами функции пишем код по заданию:
using System;
namespace MySpace
{
public static class Program
{
public static double N;
public static double f(double x, double ε)
{
if (x > 0) return 1.0 / f(-x, ε);
double y = -x, sum = 1.0, product = sum;
N = 0.0;
while (product / sum > ε)
{
N += 1.0;
product *= y / N;
sum += product;
}
N += 1.0;
return sum;
}
public static void Main()
{
int i, j, n;
double dx, x, Xнач, Xкон, y, ε;
Console.Write("Xнач Хкон dx ε » ");
var s = Console.ReadLine().Split(" ");
Xнач = double.Parse(s[0]);
Xкон = double.Parse(s[1]);
ВячеславМыслитель (9266)
1 год назад
dx = double.Parse(s[2]);
ε = double.Parse(s[3]);
n = (int)((Xкон-Xнач)/dx);
for (i = 0; i < 50; ++i) Console.Write("—");
Console.WriteLine();
Console.WriteLine(" Таблица функции у = e⁻ˣ");
for (i = 0; i < 50; ++i) Console.Write("—");
Console.WriteLine();
for (i = 0; i <= n; ++i)
{
x = Xнач + i * dx;
y = f(x, ε);
Console.WriteLine("{0,12:f8}{1,26:e16}{2,12:f0}", x, y, N);
}
for (i = 0; i < 50; ++i) Console.Write("—");
Console.WriteLine();
}
}
}
