小数点11位后精度稍逊,不知何故,求平方数感悟构思所得开方法。本算法使得开任意方变得非常简便。
void 平方开方(int n)
{
int a = 0, f = 0;
double z = 0, m = 0.1;
while ((f = a*a) < n)++a;
if (f == n)cout << a << "\t";
else
{
z = --a; a = 5;
while (m>1e-14)
{
while ((z + a*m)*(z + a*m) < n)++a;
while ((z + a*m)*(z + a*m) > n)--a;
z += a*m; a = 5;
m *= 0.1;
}
cout << setprecision(17) << z << "\t";
}
}
int p = 1;while(p<=100) 平方开方(p++);
while (m > 1e-17)修改后精度提升注意位数不能超否则运行不出结果
以上在WIN7上演算,同样程序在WIN10演算。
void 平方开方(int n)
{
int a = 0, f = 0;
long double z = 0, m = 0.1;
while ((f = a*a*a) < n)++a;
if (f == n)cout << a << "\t";
else
{
z = --a; a = 5;
while (m > 1e-17)
{
while ((z + a*m)*(z + a*m)*(z + a*m) < n)++a;
while ((z + a*m)*(z + a*m)*(z + a*m) > n)--a;
z += a*m; a = 5;
m *= 0.1;
}
cout << setprecision(34) << z << "\t";
}
}
long long 乘阶(int 数, int 次)
{
while (--次) 数 *= 数;
return 数;
}
long long 阶乘(int a)
{
long long aaa = 1; int aa = 0;
while (++aa <= a)aaa *= aa;
return aaa;
}
long double 乘方(long double 数, int 次)
{
long double 幕 = 数;
while (--次) 幕 *= 数;
return 幕;
}
void 平方开方(long double n, int c)
{
int a = 0, f = 0;
long double z = 0, m = 0.1;
while ((f = 乘方(++a, c)) < n);
if (f == n)std::cout << a << "\t";
else
{
z = --a; a = 5;
while (m>1e-17)
{
while ((乘方(z+a*m, c)) < n)++a;
while ((乘方(z+a*m, c)) > n)--a;
z += a*m;
a = 5;
m *= 0.1;
}
std::cout << std::setprecision(34) << z << "\t";
}
}
int p = 0;
while (++p <= 100) 平方开方(p,4);
WIN7计算器有开立方,WIN10怎么没看到?
while ((f = 乘方(++a, c)) > 0 && f < n);
验证开方极限是1
int f = 1;long double kf = 0;
while (++f<74)
std::cout << std::setprecision(17)
<< f << "\t次开方\t=" << (kf = 平方开方(474, f))
<< "\t次乘方\t=" << 乘方(kf, f) << std::endl;
int f = 1;long double kf = 0;
std::cout << std::setprecision(14) << (kf = 平方开方(7140229933, 2)) << "\t次乘方\t=" << 乘方(kf, 2) << std::endl;
while (++f<10000)
std::cout << std::setprecision(9) << f << "\t次开方\t=" << (kf = 平方开方(474, f)) << "\t次乘方\t=" << 乘方(kf, f) << std::endl;
//long double a = 32134789587114, aa = 0;
//cout << std::setprecision(17) << 乘方(2, 7) << "乘方*开方" << 平方开方(a, 13) <<"="<< 平方开方(a, 13) * 乘方(2, 7) << "\t";
int a = 1; long double aa = 0;
while (++a <= 100)cout << std::setprecision(17) << (aa=平方开方(INT_MAX, a)) << "\t" << 乘方(aa, a) << "\n";
long double 平方开方(long double n, int c)
{
long int a = 快速近积数(n), f = 0;
long double z = 0, m = 0.1;
while ((f = 乘方(++a, c)) > 0 && f < n);
if (f == n)return (long double)a;//std::cout << a << "\t";
else
{
z = --a; a = 5;
while (m>1e-17)
{
while ((乘方(z + a*m, c)) < n)++a;
while ((乘方(z + a*m, c)) > n)--a;
z += a*m;
a = 5;
m *= 0.1;
}
while ((乘方(z + a*m, c)) < n)++a; z += a*m;
std::cout << std::setprecision(17) << z << "\t" << 乘方(z, c) << "\n";
return z;
}
}
新官上任三把火(诸葛孔明上任火烧博望坡),新生上学三萝卜(还珠格格上学不求甚解只会萝卜,能把萝卜变成锣钹罗帛罗白全靠别人),横批还想不到,哈哈。。。挺有趣的.。
午饭时灵感得横批:指学成才。指望别人指点来学习,指望抄写别人蒙混过关。有感提问的人百相。
因此改写上下联:上联,新生上学三萝卜,下联,新官上任三把火,横批,指学成才。