Я бы так как-нибудь сделала:
from decimal import Decimal as d
def f(x, ε):
global m
s, p, y = 0, -1, -x
for i in range(2, 100000000):
p *= y; e = (i + 1) * i * p; s += e
if abs(e) < ε: m = i; break
return 1 - s / 2
print('\033[4mВЫЧИСЛЕНИЕ y(x)=(1+x)⁻³ РАЗЛОЖЕНИЕМ В РЯД')
Xнач, Xкон, dx, ε = map(d, input('\033[0mXнач Xкон dx ε: ').split())
n = int((Xкон - Xнач) / dx); print(); print(42 * '=')
print(5 * ' ', 'x:', 13 * ' ', 'y(x):', 10 * ' ', 'N:')
print(42 * "=")
for i in range(n + 1):
x = Xнач + i * dx
print("%12.8f%20.10f%10d" % (x, f(x, ε), m))
print(42 * "="); input()

Сразу говорю - у Вас в задании бред написан: |x|≤1 - вот это! А бред это потому, что при |x|=1 ряд расходится, а применять обобщённые суммы здесь бессмысленно. И близко по модулю к единице концы отрезка табуляции брать вообще не нужно! Точность тоже лучше ограничить значением где-нибудь ≈1e-10, а форсировать её не надо!
Зачем у меня в коде стоит тип decimal.Decimal? Да потому, что сравнение и прочие операции с вещественными числами всегда чреваты печальными неожиданностями, а тут стоит задача табуляции - с типом float при таких, например, данных
Xнач Xкон dx ε: -0.95 0.95 0.05 1e-10
происходит табуляция до 0.9, а не до 0.95. Но попробуйте с типом float - может у Вас получится. А я вот считаю, что лучше уж перестраховаться!
При х=0 берётся два слагаемых разложения: 1 и -2х, поэтому N=2. Конструкции \033[4m (эффект подчёркивания) и \033[0m (отмена эффектов) могут не работать - это надо специально особо проверять!