clear
// 计算1.05的100亿次方,对吗?
// 先做个测试,计算101的10次,100次等,验证是否正确
x = hex( 101 )
e = 00
y10 = call pow10( $x )
ddd = hex2int( $y10 )
eee = call calc_e16( $e )
nn = big_mul( $y10, $eee )
nn = hex2int( $nn )
? "结果 = " $ddd " * 0x" $eee " = " $nn
//[] 结果 = 431493017738751762 * 0x0100 = 0110462212541120451072 []
split
y100 = call pow10( $y10 )
ddd = hex2int( $y100 )
eee = call calc_e16( $e )
nn = big_mul( $y100, $eee )
nn = hex2int( $nn )
? "结果 = " $ddd " * 0x" $eee " = " $nn
//[] 结果 = 254624397614372642 * 0x0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 = 0270481382942152611813380223184661634893794460102382085134764823797692019407635933502947650335159448628403176304676219352932552003833280939176974971562896835086273975887442276238401555090692615650148352 []
split
y1000 = call pow10( $y100 )
ddd = hex2int( $y1000 )
eee = call calc_e16( $e )
nn = big_mul( $y1000, $eee )
nn = hex2int( $nn )
? "结果 = " $ddd " * 0x" $eee " = " $nn
//[] 结果 = 333735495872339212 * 0x01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 = 02095915563781366202320581552263356425972714912118311047202813878456144104695399311547387243988955125395693334199910477673174286110092391220193526121304209983260700228756730773270094717527712168911767623073965639953298386861932665035826726890690751277019696865752595560920819307350644901553030166306127236404073465539128608575392739811425305154448359039735350244892337051961862322357593387697149035252457380546783979951732331105973191110658654300089835374054305672513809777702096899360822101458098478217956324290683973710309238281920258502465027248761102238546072267294516753474088054083096574324045791289419053381871739669110211165865913442726741226701721358072800088612781671022868917060728451318786194091805746772819959813907710803532977084029060115791703834538715905626278951407319274590550649195946263858248669679061034956416877289724993741007920218660360054252451413910811901544687750058151884481634645731878124172027330501433519434678923492996048805108503363396616262629062582982420889688006184391313389336288117846329398972056339111655237536788353627619332059653431487490434092195860069519681575107709782865651747601836976568756671566549905737709983628900178406609498009135635853614733678723680416193240374543282903683111827824314348543147669246330372388483167098596487809173745514067522598402931416663782087241088247417653161845443650166531076308728651426081988959117411291410048675519279647535342790888397404414711522856453406521041205069253227865905748060461363068764823824621915108753357271754353147066342683929870657460605046615904648251414377506206177904431135140349321760190755153993965809801224278434038291174216733528805932496165446258201895380803441038741579231781957483154011377306372323672579324164310155325995934074891216021028544707410800775886752630598527588243894020970577139173019008327253582574547554701172403715027112045846599487208929654117014166771001987158613508171994730323459083476933539732740220143245347284021375493706055152792061741756197425901410138963173399858576883712 []
split
y10000 = call pow10( $y1000 )
ddd = hex2int( $y10000 )
eee = call calc_e16( $e )
// 算不出来了,为了算这个增加shl没啥必要
x = hex( 105 ) // 1.05
x2 = big_mul( $x, $x )
x4 = big_mul( $x2, $x2 )
x8 = big_mul( $x4, $x4 )
x16 = big_mul( $x8, $x8 )
x32 = big_mul( $x16, $x16 )
x64 = big_mul( $x32, $x32 )
x128 = big_mul( $x64, $x64 )
x256 = big_mul( $x128, $x128 )
x512 = big_mul( $x256, $x256 )
x768 = big_mul( $x512, $x256 )
x896 = big_mul( $x768, $x128 )
x960 = big_mul( $x896, $x64 )
x992 = big_mul( $x960, $x32 )
x1000 = big_mul( $x992, $x8 )
// x 1000 有2000位的小数
// 我先转换成10进制整数,然后去掉其后2000位
d1000 = hex2int( $x1000 )
len = datalen( $d1000 )
len = sub( $len, hex( 1000 ) )
x1000 = hmid( $d1000, 00, $len )
// 我得到 1546318920731927238984
// 计算器得到 1546318920731927238984.568017163
// 这一步还是正确的
// 再转回16进制数
x1000 = int2hex( $x1000 )
// 不四舍五入,直接加1
x1000 = big_add( $x1000, 01 )
// 从现在开始,计算一个数的10次方,为
// 保证数据不溢出,只取高16位,同时
// 维护一个指数位,指数的计算原则是
// 默认e = 0,如果进行乘法,那么指数相加
// 如果舍去低位,那么指数要加上舍去的位数。
// 要注意这里e是256的次方
e = 00 // x * 256 ^ e,也就是x * 256 ^ 0,x * 1 = x
? "x^一万"
x10_4 = call pow10( $x1000 )
ddd = hex2int( $x10_4 )
eee = hex2int( $e )
? "最终结果 = " $ddd " * 256 ^ " $eee
split
? "x^十万"
x10_5 = call pow10( $x10_4 )
ddd = hex2int( $x10_5 )
eee = hex2int( $e )
? "最终结果 = " $ddd " * 256 ^ " $eee
split
? "x^百万"
x10_6 = call pow10( $x10_5 )
? "x^千万"
x10_7 = call pow10( $x10_6 )
? "x^亿"
x10_8 = call pow10( $x10_7 )
? "x^十亿"
x10_9 = call pow10( $x10_8 )
? "x^百亿"
x10_10 = call pow10( $x10_9 )
ddd = hex2int( $x10_10 )
eee = hex2int( $e )
? "最终结果 = " $ddd " * 256 ^ " $eee
//[]======================================================[]
//[] 最终结果 = 08689503231699367552 * 256 ^ 87986652 []
//[]======================================================[]
end
pow10:
prompt off
local z
local z2
local z4
local z8
local z10
local len
local e2
z = getpara
z2 = big_mul( $z, $z )
e = big_add( $e, $e )
e2 = $e
z4 = big_mul( $z2, $z2 )
e = big_add( $e, $e )
z8 = big_mul( $z4, $z4 )
e = big_add( $e, $e )
z10 = big_mul( $z8, $z2 )
e = big_add( $e, $e2 )
len = datalen( $z10 )
if $len > 08
len = sub( $len, 08 )
// 只取高8位
z10 = hmid( $z10, 00, 08 )
// 不四舍五入,直接加1
z10 = big_add( $z10, 01 )
// 低位进入指数
e = big_add( $e, $len )
endif
prompt on
return $z10
calc_e10:
// 计算0x0100 ^ e 的10进制值
prompt off
local e10
local e16
e16 = getpara
e16 = shl( 01, int( 0x$e16 * 8 ) )
e10 = hex2int( $e16 )
prompt on
return $e10
calc_e16:
// 计算0x0100 ^ e 的16进制值
prompt off
local e16
e16 = getpara
e16 = shl( 01, int( 0x$e16 * 8 ) )
prompt on
return $e16