vicvolfЯ бы не сказал что добавление

как-то кардинально улучшает ситуацию, скорее наоборот лишь
ухудшает:
Код:
? foreach([9],t, p=precprime(10^t); x=1.*p^2; forprime(pp=2,p, x*=(pp-1)/pp); print("p=",p,": ",n=primepi(p^2)," / ",x," = ",n/x))
p=999999937: 24739951247708012 / 27093151456133562.717416504482260808139 = 0.91314409428391489051640458779143640003
? foreach([9],t, p=precprime(10^t); x=1.*p^2; forprime(pp=2,p, x*=(pp-1)/pp); x+=primepi(p); print("p=",p,": ",n=primepi(p^2)," / ",x," = ",n/x))
p=999999937: 24739951247708012 / 27093151506981096.717416504482260808139 = 0.91314409257015614343832278970425036512
Но разница всего лишь в 9-м знаке, а погрешность уже в первом.
Так что я сильно сомневаюсь что формула станет точной на любом интервале, хоть бы и бесконечном - погрешность похоже растёт с ростом

, а не падает, а Вы её и ещё увеличили.