我正在尝试查找x^y
x
为正,y为实数。有许多在线资源可以找到整数,但实际数字并不多。
示例:
6 ^ 4.3 = 2218.4537377949778046576946747662
我不应该使用任何数学库。我知道这有效:
exp(y*log(x))
但我必须在没有任何库的情况下找到exp。有没有我可以使用的系列来获得实数?我是用Java做的。
答案 0 :(得分:2)
指数的整数部分很容易通过重复squaring来处理。
对于小数部分,您可以使用二进制表示法并使用由Heron's方法计算的平方根(x^0.1b=sqrt(x)
,x^0.01b=sqrt(sqrt(x))
...)。
4.3 = 4 + 1/4 + 1/32 + 1/64 + 1/512...
然后
6^4=1296
和Heron的迭代
6^(1/2) = 3.5
6^(1/2) = 2.60714285714
6^(1/2) = 2.45425636008
6^(1/2) = 2.44949437161
6^(1/2) = 2.44948974279
6^(1/2) = 2.44948974278
6^(1/2) = 2.44948974278
6^(1/4) = 1.72474487139
6^(1/4) = 1.57247448714
6^(1/4) = 1.56510194466
6^(1/4) = 1.56508458017
6^(1/4) = 1.56508458007
6^(1/4) = 1.56508458007
6^(1/8) = 1.28254229004
6^(1/8) = 1.25142045246
6^(1/8) = 1.25103346471
6^(1/8) = 1.25103340486
6^(1/8) = 1.25103340486
6^(1/8) = 1.25103340486
6^(1/16) = 1.12551670243
6^(1/16) = 1.11851794241
6^(1/16) = 1.11849604619
6^(1/16) = 1.11849604597
6^(1/16) = 1.11849604597
6^(1/32) = 1.05924802299
6^(1/32) = 1.0575910323
6^(1/32) = 1.05758973424
6^(1/32) = 1.05758973424
6^(1/32) = 1.05758973424
6^(1/64) = 1.02879486712
6^(1/64) = 1.02839189837
6^(1/64) = 1.02839181942
6^(1/64) = 1.02839181942
6^(1/64) = 1.02839181942
6^(1/128) = 1.01419590971
6^(1/128) = 1.01409655817
6^(1/128) = 1.0140965533
6^(1/128) = 1.0140965533
6^(1/256) = 1.00704827665
6^(1/256) = 1.0070236114
6^(1/256) = 1.00702361109
6^(1/256) = 1.00702361109
6^(1/512) = 1.00351180555
6^(1/512) = 1.00350566074
6^(1/512) = 1.00350566072
6^(1/512) = 1.00350566072
最后,
6^4.3 = 1296 * 1.56508458007 * 1.05758973424 * 1.02839181942 * 1.00351180555 ...
= 2218.45373705
这种方法不是最优的,它不会很快收敛,也不是很准确,但实现起来相当简单。
答案 1 :(得分:1)
为了在效率和易于实施之间做出妥协,您可以使用Taylor扩展开发自己的pow
函数exp(y.ln(x))
。
"最难"部分是对数。
首先通过找x
2
和x=(2^n).x'
的力量来标准化1<=x'<2
。然后是ln(x) = n.ln(2) + ln(x')
。
6 = (2^2) x 1.5
inverse hyperbolic tangent系列评估ln(x') = 2 argth((x'-1) / (x'+1))
。
ln(1.5) = 2 (0.2 + 0.2^3/3 + 0.2^5/5...) =
0.4
0.405333333333
0.405461333333
0.405464990476
0.405465104254
0.405465107978
0.405465108104
0.405465108108
...
ln(6) = 2 x 0.69314718056 + 0.405465108108 = 1.791759469228
然后计算y.ln(x)
,分成整数部分(通过平方使用取幂)和小数部分。
4.3 x 1.791759469228 = 7.704565717681
e^7 = 1096.633158428
对于小数部分,请使用exponential的标准泰勒开发。
e^0.704565717681 = 1 + 0.704565717681 + 0.704565717681^2/2 + 0.704565717681^3/6...
1
1.70456571768
1.95277214295
2.01106472233
2.02133246059
2.02277931986
2.0229492211
2.02296632204
2.02296782814
2.02296794604
2.02296795435
2.02296795488
2.02296795491
...
并乘以
6^4.3 = 1096.633158428 x 2.02296795491 = 2218.45373779