clear

// 计算1.05的100亿次方,对吗?
// 先做个测试,计算101的10次,100次等,验证是否正确
x       hex101 )
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       hex105 )    // 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$lenhex1000 ) )
x1000   hmid$d100000$len )
// 我得到     1546318920731927238984
// 计算器得到 1546318920731927238984.568017163
// 这一步还是正确的
// 再转回16进制数
x1000   int2hex$x1000 )
// 不四舍五入,直接加1
x1000   big_add$x100001 )

// 从现在开始,计算一个数的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$len08 )
        
// 只取高8位
        
z10 hmid$z100008 )
        
// 不四舍五入,直接加1
        
z10 big_add$z1001 )
        
// 低位进入指数
        
e   big_add$e$len )
    
endif
    
prompt on
return $z10

calc_e10:
    
// 计算0x0100 ^ e 的10进制值
    
prompt off

    
local e10
    
local e16

    
e16 getpara

    
e16 shl01int0x$e16 * 8 ) )
    
e10 hex2int$e16 )
    
prompt on

return $e10

calc_e16:
    
// 计算0x0100 ^ e 的16进制值
    
prompt off

    
local e16

    
e16 getpara

    
e16 shl01int0x$e16 * 8 ) )
    
prompt on

return $e16