数学复习
1. 正整数次方
1
0
n
{
n
=
1
,
2
,
3
,
4......
n
}
10^n \lbrace n=1,2,3,4......n\rbrace
10n{n=1,2,3,4......n}
表示n个10相乘
当n=2时,表示为
1
0
2
10^2
102
当n=3时,表示为
1
0
3
10^3
103
2. 负整数次方
1
0
n
{
n
=
−
1
,
−
2
,
−
3
,
−
4......
−
n
}
10^n \lbrace n=-1,-2,-3,-4......-n\rbrace
10n{n=−1,−2,−3,−4......−n}
表示n个10相乘
当n=-1时,表示为
1
0
−
1
=
0.1
10^{-1}=0.1
10−1=0.1
当n=-2时,表示为
1
0
−
2
=
0.01
10^{-2}=0.01
10−2=0.01
当n=-3时,表示为
1
0
−
3
=
0.001
10^{-3}=0.001
10−3=0.001
3. 开方
1
0
1
n
{
n
<
1
∩
n
>
0
}
10^\frac{1}n \lbrace n<1 \cap n>0\rbrace
10n1{n<1∩n>0}
表示为开n次方,
当
n
=
1
2
时
,
表
示
为
1
2
0
当n=\frac{1}2时,表示为\sqrt[2]10
当n=21时,表示为210
当
n
=
1
3
时
,
表
示
为
1
3
0
当n=\frac{1}3时,表示为\sqrt[3]10
当n=31时,表示为310
…
当
n
=
1
n
时
,
表
示
为
1
n
0
当n=\frac{1}n时,表示为\sqrt[n]10
当n=n1时,表示为n10
4. 常见的1-9指数值
l
o
g
1
≈
0
log1\approx0
log1≈0
1
0
0
≈
1
10^{0}\approx1
100≈1
l
o
g
2
≈
0.301029995664
log2\approx0.301029995664
log2≈0.301029995664
1
0
0.301029995664
≈
2
10^{0.301029995664}\approx2
100.301029995664≈2
l
o
g
3
≈
0.477121254720
log3\approx0.477121254720
log3≈0.477121254720
1
0
0.477121254720
≈
3
10^{0.477121254720}\approx3
100.477121254720≈3
l
o
g
4
≈
0.602059991328
log4\approx0.602059991328
log4≈0.602059991328
1
0
0.602059991328
≈
4
10^{0.602059991328}\approx4
100.602059991328≈4
l
o
g
5
≈
0.698970004336
log5\approx0.698970004336
log5≈0.698970004336
1
0
0.698970004336
≈
5
10^{0.698970004336}\approx5
100.698970004336≈5
l
o
g
6
≈
0.778151250384
log6\approx0.778151250384
log6≈0.778151250384
1
0
0.778151250384
≈
6
10^{0.778151250384}\approx6
100.778151250384≈6
l
o
g
7
≈
0.845098040014
log7\approx0.845098040014
log7≈0.845098040014
1
0
0.845098040014
≈
7
10^{0.845098040014}\approx7
100.845098040014≈7
l
o
g
8
≈
0.903089986992
log8\approx0.903089986992
log8≈0.903089986992
1
0
0.903089986992
≈
8
10^{0.903089986992}\approx8
100.903089986992≈8
l
o
g
9
≈
0.954242509439
log9\approx0.954242509439
log9≈0.954242509439
1
0
0.954242509439
≈
9
10^{0.954242509439}\approx9
100.954242509439≈9
5.任意数开任意次方的公式
设被开方数为A,开次方数为B,C为变量。
C
(
B
−
1
)
+
A
C
B
−
1
B
\frac{C(B-1)+\frac{A}{C^{B-1}}}B
BC(B−1)+CB−1A
首次C取值为1,带入A,B常量计算结果,并用计算结果值替换公式中的变量 C。再次计算结果,再次替换,当C=公式计算结果值,此时C即为根。循环步骤受开方数字长度影响,此法也可笔算进行。采用的是牛顿迭代法。且 A、B 可为小数,分数,负数,此法为逐次逼近法。可简单的实现编程。但是注意:不能计算负数开偶数次方。
下面为:代入法
1、把被开方的整数部分从个位起向左每隔n位为一节,用撇号分开;
2、根据左边第一节里的数,求得开n次算术根的最高位上的数,假设这个数为a;
3、从第一节的数减去求得的最高位上数的n次方,在它们的差的右边写上第二节数作为第一个余数;
4、用第一个余数除以
n
(
10
a
)
(
n
−
1
)
n(10a)^{(n-1)}
n(10a)(n−1),所得的整数部分试商(如果这个最大整数大于或等于10,就用9做试商);
5、设试商为b。如果
(
10
a
+
b
)
n
−
(
10
a
)
n
(10a+b)^n-(10a)^n
(10a+b)n−(10a)n小于或等于余数,这个试商就是n次算术根的第二位;如果
(
10
a
+
b
)
n
−
(
10
a
)
n
(10a+b)^n-(10a)^n
(10a+b)n−(10a)n大于余数,就把试商逐次减1再试,直到
(
10
a
+
b
)
n
−
(
10
a
)
n
(10a+b)^n-(10a)^n
(10a+b)n−(10a)n小于或等于余数为止。
6、用同样的方法,继续求n次算术跟的其它各位上的数(如果已经算了k位数数字,则a要取为全部k位数字)。公式:
x
n
+
1
=
x
n
+
(
A
x
n
k
−
1
−
x
n
)
1
k
x_{n+1}=x_n+(\frac{A}{x_n^{k-1}}-x_n)\frac{1}k
xn+1=xn+(xnk−1A−xn)k1
例如,开立方,A=5,即k=3.公式:
x
n
+
1
=
x
n
+
(
5
x
n
k
−
1
−
x
n
)
1
3
x_{n+1}=x_n+(\frac{5}{x_n^{k-1}}-x_n)\frac{1}3
xn+1=xn+(xnk−15−xn)31
5介于
1
3
1^3
13至
2
3
2^3
23之间(1的3次方=1,2的3次方=8)
x
0
x_0
x0可以取1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2.0都可以。例如我们取2.0.按照公式:
第一步:
x
1
=
{
2.0
+
[
5
2.
0
2
−
2.0
]
1
3
=
1.7
}
。
输
入
值
大
于
输
出
值
,
负
反
馈
;
x_1=\lbrace2.0+\lbrack\frac{5}{2.0^2}-2.0\rbrack\frac{1}3=1.7\rbrace。 输入值大于输出值,负反馈;
x1={2.0+[2.025−2.0]31=1.7}。输入值大于输出值,负反馈;
即
5
(
2
×
2
)
=
1.25
,
1.25
−
2
=
−
0.75
,
0.75
×
1
3
=
0.25
,
2
−
0.25
=
1.75
,
取
2
位
数
值
,
即
1.7
。
即\frac{5}{(2\times2)}=1.25,1.25-2=-0.75,0.75\times\frac{1}3=0.25,2-0.25=1.75 ,取2位数值,即1.7。
即(2×2)5=1.25,1.25−2=−0.75,0.75×31=0.25,2−0.25=1.75,取2位数值,即1.7。
第二步:
x
2
=
{
1.7
+
[
5
1.
7
2
−
1.7
]
1
3
=
1.71
}
。
输
入
值
小
于
输
出
值
,
正
反
馈
;
x_2=\lbrace1.7+\lbrack\frac{5}{1.7^2}-1.7\rbrack\frac{1}3=1.71\rbrace。 输入值小于输出值,正反馈;
x2={1.7+[1.725−1.7]31=1.71}。输入值小于输出值,正反馈;
即
5
(
1.7
×
1.7
)
=
1.73010
,
1.73
−
1.7
=
0.03
,
0.03
×
1
3
=
0.01
,
1.7
+
0.01
=
1.71
,
取
3
位
数
,
比
前
面
多
取
一
位
数
。
即\frac{5}{(1.7\times1.7)}=1.73010,1.73-1.7=0.03,0.03\times\frac{1}3=0.01,1.7+0.01=1.71 ,取3位数,比前面多取一位数。
即(1.7×1.7)5=1.73010,1.73−1.7=0.03,0.03×31=0.01,1.7+0.01=1.71,取3位数,比前面多取一位数。
第三步:
x
3
=
{
1.71
+
[
5
1.7
1
2
−
1.71
]
1
3
=
1.709
}
。
输
入
值
大
于
输
出
值
,
负
反
馈
;
x_3=\lbrace1.71+\lbrack\frac{5}{1.71^2}-1.71\rbrack\frac{1}3=1.709\rbrace。 输入值大于输出值,负反馈;
x3={1.71+[1.7125−1.71]31=1.709}。输入值大于输出值,负反馈;
第四步:
x
4
=
{
1.709
+
[
5
1.70
9
2
−
1.709
]
1
3
=
1.7099
}
。
输
入
值
大
于
输
出
值
,
负
反
馈
;
x_4=\lbrace1.709+\lbrack\frac{5}{1.709^2}-1.709\rbrack\frac{1}3=1.7099\rbrace。 输入值大于输出值,负反馈;
x4={1.709+[1.70925−1.709]31=1.7099}。输入值大于输出值,负反馈;
这种方法可以自动调节,第一步与第三步取值偏大,但是计算出来以后输出值会自动转小;第二步,第四步输入值偏小,输出值自动转大。
x
4
=
1.7099
。
x_4=1.7099。
x4=1.7099。
5.1开任意次方的计算机程序代码
对于任意实数的开方,可以使用切线法得到其任意精度的结果,切线法的迭代公式为:
x
k
+
1
=
(
n
−
1
)
x
k
n
+
a
n
x
k
n
−
1
x_{k+1}=\frac{(n-1)x_k^n+a}{nx_k^{n-1}}
xk+1=nxkn−1(n−1)xkn+a
取任意初始值
x
0
>
0
x_0 > 0
x0>0, 以上迭代序列将会收敛:
x
∞
=
a
n
x_\infty=\sqrt[n]a
x∞=na
实际应用中一般取初始值为稍微大
a
n
\sqrt[n]a
na的实数,这样可以加快序列的收敛速度。
C语言代码如下:
// 2015-12-24
// By: ChenYu
#include "math.h"
#include "stdio.h"
#define ABS(a) ((a)<0?-(a):(a))
#ifdef _WIN32
typedef unsigned __int64 uint64;
#else
typedef unsigned long long uint64;
#endif
// calculate a approximate value
static double calcInitRoot(double x, int n)
{
const uint64 exptMask=((uint64)1<<11)-1;
const uint64 fracMask=((uint64)1<<52)-1;
uint64 xInt=*(uint64*)&x;
int xExpt=(int)((xInt>>52)&exptMask)-1023;
xInt=((uint64)((xExpt+1024*n-1)/n)<<52)+(xInt&fracMask)/n;
return *(double*)&xInt;
}
double calcRoot(double x, int n)
{
int i, j, s=1-((x<0)<<(n&1));
double a=ABS(x);
double x1, x0=calcInitRoot(a, n);
double err=x0*1e-14;
if(x==0)
return 0;
for(i=1; i<50; i++)
{
double xn=1;
for(j=0; j<n-1; j++)
xn*=x0;
x1=((n-1)*x0*xn+a)/(xn*n);
// printf("x%d=%.14f\n", i, x1);
if(ABS(x1-x0)<=err)
break;
x0=x1;
}
return s*x1;
}
void main()
{
double x=-31141.592653589793;
int n=11;
double y=calcRoot(x, n);
printf("root(%g,%d)=%+.14f\n", x, n, y);
printf("root(%g,%d)=%+.14f\n", x, n, pow(ABS(x), 1.0/n));
}