CALL TEMPS "32 FARENHEIT"
EXIT
TEMPS: PROCEDURE
call e
numeric digits length(e) - 1
parse arg tList
tList= space(tList)
do until tList=''
parse var tList x ',' tList
x= translate(x, '(((', "[{«")
x= space(x)
parse var x z '('
parse upper var z z ' TO ' ! .
parse upper var z z 'NOT' not . , noS noE
xxxxxx
xxxxxx
if not\=='' then do
if left(not, 1) == '*' then noE= substr(not, 2)
if right(not, 1) == '*' then noS= left(not, length(not) - 1)
noL= length(noE || noS)
if noL==0 then call serr
"illegal NOT keyword, no leading or trailing * specified."
end
if !=='' then != "ALL"
all= (!=='ALL')
if z=='' then call serr 'no arguments were specified.'
_= verify(z, '+-.0123456789')
n= z
if _\==0 then do
if _==1 then call serr 'illegal temperature:' z
n= left(z, _-1)
u= strip( substr(z, _) )
end
else u= 'k'
if \datatype(n, 'N') then call serr "illegal number:" n
if \all then do
call scaleName !
!= sn
end
call scaleName u
call convert2Fahrenheit
say right(' ' x, 79, "-")
call convert2specific
end
RETURN
$: procedure; showDig= 8
_= commas( format( arg(1), , showDig ) / 1 )
p= pos(., _)
if p==0 then _= _ || left('', 5 + showDig + 1)
else _= _ || left('', 5 + showDig - length(_) + p)
return right(_, max(40, length(_) ) )
convert2Fahrenheit:
select
when sn=='ABSOLUTE' then F= n * 9/5 - 459.67
when sn=='AMONTON' then F= n * 8.37209 - 399.163
when sn=='BARNSDORF' then F= n * 6.85714 + 6.85714
when sn=='BEAUMUIR' then F= n * 2.22951 + 32
when sn=='BENART' then F= n * 1.43391 + 31.2831
when sn=='BERGEN' then F=(n + 23.8667) * 15/14
when sn=='BRISSEN' then F= n * 32/15 + 32
when sn=='CELSIUS' then F= n * 9/5 + 32
when sn=='CIMENTO' then F= n * 2.70677 - 4.54135
when sn=='CRUQUIUS' then F= n * 0.409266 - 405.992
when sn=='DALENCE' then F= n * 2.7 + 59
when sn=='DALTON' then F= 273.15 * pow(273.15 / 273.15, n / 100) * 1.8 - 459.67
when sn=='DANIELL' then F= n * 7.27194 + 55.9994
when sn=='DE LA HIRE' then F=(n - 3) / 0.549057
when sn=='DE LA VILLE' then F=(n + 6.48011) / 0.985568
when sn=='DELISLE' then F=212 - n * 6/5
when sn=='DELISLE OLD' then F=212 - n * 1.58590197
when sn=='DE LUC' then F=(n + 14) * 16/7
when sn=='DE LYON' then F=(n + 17.5) * 64/35
when sn=='DE REVILLAS' then F=212 - n * 97/80
when sn=='DERHAM' then F= n / 0.38444386 - 188.578
when sn=='DERHAM OLD' then F= n * 3 + 4.5
when sn=='DE SUEDE' then F=(n + 17.6666) * 150/83
when sn=='DE VILLENEUVE' then F=(n + 23.7037) / 0.740741
when sn=='DU CREST' then F=(n + 37.9202) / 0.650656
when sn=='EDINBURGH' then F= n * 4.6546 - 6.40048
when sn=='ELECTRON VOLTS' then F= n * 20888.1 - 459.67
when sn=='FAHRENHEIT' then F= n
when sn=='FAHRENHEIT OLD' then F= n * 20/11 - 89.2727
when sn=='FLORENTINE LARGE' then F=(n + 7.42857) / 0.857143
when sn=='FLORENTINE MAGNUM' then F=(n + 73.9736 ) / 1.50659
when sn=='FLORENTINE SMALL' then F=(n - 1.38571) / 0.378571
when sn=='FOWLER' then F= n * 0.640321 + 53.7709
when sn=='FRICK' then F= n * 200/251 + 58.5339
when sn=='GASMARK' then F= n * 25 + 250
when sn=='GOUBERT' then F= n * 2 + 32
when sn=='HALES' then F= n * 1.2 + 32
when sn=='HANOW' then F= n * 1.06668 - 10.6672
when sn=='HAUKSBEE' then F= n * 18/25 + 88.16
when sn=='JACOBS-HOLBORN' then F= n * 18/71 - 53.4366
when sn=='KELVIN' then F= n * 9/5 - 459.67
when sn=='LEIDEN' then F= n * 1.8 - 423.4
when sn=='NEWTON' then F= n * 60/11 + 32
when sn=='OERTEL' then F= n + n - 32
when sn=='PLANCK' then F= n * 1.416833e32 * 9/5 - 459.67
when sn=='RANKINE' then F= n - 459.67
when sn=='REAUMUR' then F= n * 9/4 + 32
when sn=='RICHTER' then F= n * 160/73 - 7.45205
when sn=='RINALDINI' then F= n * 15 + 32
when sn=='ROMER' then F=(n - 7.5) * 27/4 + 32
when sn=='ROSENTHAL' then F= n * 45/86 - 453.581
when sn=='ROYAL SOCIETY' then F=(n -122.82) * -50/69
when sn=='SAGREDO' then F= n * 0.3798 - 5.98
when sn=='SAINT-PATRICE' then F= n * 2.62123 + 115.879
when sn=='STUFE' then F= n * 45 + 257
when sn=='SULZER' then F= n * 1.14595 + 33.2334
when sn=='THERMOSTAT' then F= n * 54 + 32
when sn=='WEDGWOOD' then F= n * 44.7429295 + 516.2
otherwise call serr 'invalid temperature scale: ' u
end
return
convert2specific: xxx
K = (F + 459.67) * 5/9
a = (1e || (-digits() % 2) - digits() % 20)
eV = (F + 459.67) / 20888.1
if ?('ABSOLUTE') then say $( k ) "Absolute"
if ?('AMONTON') then say $( ( F + 399.163 ) / 8.37209 ) "Amonton"
if ?('BARNSDORF') then say $( ( F - 6.85715) / 6.85715 ) "Barnsdorf"
if ?('BEAUMUIR') then say $( ( F - 32 ) / 2.22951 ) "Beaumuir"
if ?('BENART') then say $( ( F - 31.2831 ) / 1.43391 ) "Benart"
if ?('BERGEN') then say $( ( F * 14/15 ) - 23.8667 ) "Bergen"
if ?('BRISSON') then say $( ( F - 32 ) * 15/32 ) "Brisson"
if ?('CELSIUS') then say $( ( F - 32 ) * 5/9 ) "Celsius"
if ?('CIMENTO') then say $( ( F + 4.54135) / 2.70677 ) "Cimento"
if ?('CRUQUIUS') then say $( ( F + 405.992 ) / 0.409266 ) "Cruquius"
if ?('DALENCE') then say $( ( F - 59 ) / 2.7 ) "Dalence"
if ?('DALTON') then if K>a then say $(100*ln(k/273.15)/ln(373.15/273.15) ) "Dalton"
else say right("-infinity ", 60) "Dalton"
if ?('DANIELL') then say $( ( F - 55.9994 ) / 7.27194 ) "Daniell"
if ?('DE LA HIRE') then say $( F * 0.549057 + 3 ) "De la Hire"
if ?('DE LA VILLE') then say $( F * 0.985568 - 6.48011 ) "De la Ville"
if ?('DELISLE') then say $( ( 212 - F ) * 5/6 ) "Delisle"
if ?('DELISLE OLD') then say $( ( 212 - F ) / 1.58590197 ) "Delisle OLD"
if ?('DE LUC') then say $( F * 7/16 - 14 ) "De Luc"
if ?('DE LYON') then say $( F * 35/64 - 17.5 ) "De Lyon"
if ?('DE REVILLAS') then say $( ( 212 - F ) * 80/97 ) "De Revillas"
if ?('DERHAM') then say $( F * 0.38444386 + 72.4978 ) "Derham"
if ?('DERHAM OLD') then say $( ( F - 4.5 ) / 3 ) "Derham OLD"
if ?('DE VILLENEUVE') then say $( F * 0.740741 - 23.7037 ) "De Villeneuve"
if ?('DE SUEDE') then say $( F * 83/150 - 17.6666 ) "De Suede"
if ?('DU CREST') then say $( F * 0.650656 - 37.9202 ) "Du Crest"
if ?('EDINBURGH') then say $( ( F + 6.40048) / 4.6546 ) "Edinburgh"
if ?('ELECTRON VOLTS') then say $( eV ) "electron volt"s(eV)
if ?('FAHRENHEIT') then say $( F ) "Fahrenheit"
if ?('FAHRENHEIT OLD') then say $( F * 20/11 - 89.2727 ) "Fahrenheit OLD"
if ?('FLORENTINE LARGE') then say $( F * 0.857143 - 7.42857 ) "Florentine large"
if ?('FLORENTINE MAGNUM') then say $( F * 1.50659 - 73.9736 ) "Florentine Magnum"
if ?('FLORENTINE SMALL') then say $( F * 0.378571 + 1.38571 ) "Florentine small"
if ?('FOWLER') then say $( ( F - 53.7709 ) / 0.640321 ) "Fowler"
if ?('FRICK') then say $( ( F - 58.5338 ) * 251/200 ) "Frick"
if ?('GAS MARK') then say $( ( F - 250 ) * 0.04 ) "gas mark"
if ?('GOUBERT') then say $( ( F + 32 ) * 0.5 ) "Goubert"
if ?('HALES') then say $( ( F - 32 ) / 1.2 ) "Hales"
if ?('HANOW') then say $( ( F + 10.6672 ) / 1.06668 ) "Hanow"
if ?('HAUKSBEE') then say $( ( F - 88.16 ) * 25/18 ) "Hauksbee"
if ?('JACOBS-HOLBORN') then say $( ( F + 53.4366 ) * 71/18 ) "Jacobs-Holborn"
if ?('KELVIN') then say $( k ) "kelvin"s(k)
if ?('LEIDEN') then say $( F / 1.8 + 235.222 ) "Leiden"
if ?('NEWTON') then say $( ( F - 32 ) * 11/60 ) "Newton"
if ?('OERTEL') then say $( ( F + 32 ) * 0.5 ) "Oertel"
if ?('PLANCK') then say $( ( F + 459.67 ) * 5/9 / 1.416833e32 ) "Planck"
if ?('RANKINE') then say $( F + 459.67 ) "Rankine"
if ?('REAUMUR') then say $( ( F - 32 ) * 4/9 ) "Reaumur"
if ?('RICHTER') then say $( ( F + 7.45205) * 73/160 ) "Richter"
if ?('RINALDINI') then say $( ( F - 32 ) / 15 ) "Rinaldini"
if ?('ROMER') then say $( ( F - 32 ) * 4/27 + 7.5 ) "Romer"
if ?('ROSENTHAL') then say $( ( F + 453.581 ) * 86/45 ) "Rosenthal"
if ?('ROYAL SOCIETY') then say $( F * -69/50 + 122.82 ) "Royal Society of London"
if ?('SAGREDO') then say $( ( F + 5.98 ) / 0.3798 ) "Segredo"
if ?('SAINT-PATRICE') then say $( ( F - 115.879 ) / 2.62123 ) "Saint-Patrice"
if ?('STUFE') then say $( ( F - 257 ) / 45 ) "Stufe"
if ?('SULZER') then say $( ( F - 33.2334 ) / 1.14595 ) "Sulzer"
if ?('THERMOSTAT') then say $( ( F - 32 ) / 54 ) "Thermostat"
if ?('WEDGWOOD') then say $( ( F - 516.2 ) / 44.7429295 ) "Wedgwood"
return
scaleName: parse arg y
yU= translate(y, '-eE', "_éÉ")
upper yU
if left(yU, 7)=='DEGREES' then yU=substr(yU, 8)
if left(yU, 6)=='DEGREE' then yU=substr(yU, 7)
yU= strip(yU)
_= length(yU)
if right(yU,1)=='S' & _>1 then yU=left(yU, _-1)
select
when abbrev('ABSOLUTE' , yU, 1) then sn= "ABSOLUTE"
when abbrev('AMONTON' , yU) then sn= "AMONTON"
when abbrev('BARNDORF' , yU,2) |
abbrev('BARNSDORF' , yU,2) then sn= "BARNSDORF"
when abbrev('BEAUMIUR' , yU,3) |
abbrev('BEAUMUIR' , yU,3) then sn= "BEAUMUIR"
when abbrev('BENERT' , yU,3) |
abbrev('BENART' , yU,3) then sn= "BENART"
when abbrev('BRISSEN' , yU,3) |
abbrev('BRISSON' , yU,3) then sn= "BRISSEN"
when abbrev('BURGEN' , yU,3) |
abbrev('BURGAN' , yU,3) |
abbrev('BERGAN' , yU,3) |
abbrev('BERGEN' , yU,3) then sn= "BERGEN"
when abbrev('CENTIGRADE' , yU) |
abbrev('CENTRIGRADE' , yU) |
abbrev('CETIGRADE' , yU) |
abbrev('CENTINGRADE' , yU) |
abbrev('CENTESIMAL' , yU) |
abbrev('CELCIU' , yU) |
abbrev('CELCIOU' , yU) |
abbrev('CELCUI' , yU) |
abbrev('CELSUI' , yU) |
abbrev('CELCEU' , yU) |
abbrev('CELCU' , yU) |
abbrev('CELISU' , yU) |
abbrev('CELSU' , yU) |
abbrev('CELSIU' , yU) then sn= "CELSIUS"
when abbrev('CIMANTO' , yU,2) |
abbrev('CIMENTO' , yU,2) then sn= "CIMENTO"
when abbrev('CRUQUIOU' , yU,2) |
abbrev('CRUQUIO' , yU,2) |
abbrev('CRUQUIU' , yU,2) then sn= "CRUQUIU"
when abbrev('DALANCE' , yU,4) |
abbrev('DALENCE' , yU,4) then sn= "DALENCE"
when abbrev('DANELLE' , yU,3) |
abbrev('DANEAL' , yU,3) |
abbrev('DANIAL' , yU,3) |
abbrev('DANIELE' , yU,3) |
abbrev('DANNEL' , yU,3) |
abbrev('DANYAL' , yU,3) |
abbrev('DANYEL' , yU,3) |
abbrev('DANIELL' , yU,3) then sn= "DANIELL"
when abbrev('DALTON' , yU,3) then sn= "DALTON"
when abbrev('DELAHIRE' , yU,7) |
abbrev('LAHIRE' , yU,4) |
abbrev('HIRE' , yU,2) |
abbrev('DE-LA-HIRE' , yU,7) then sn= "DE LA HIRE"
when abbrev('DELAVILLE' , yU,7) |
abbrev('LAVILLE' , yU,3) |
abbrev('VILLE' , yU,1) |
abbrev('VILLA' , yU,1) |
abbrev('DE-LA-VILLE' , yU,7) then sn= "DE LA VILLE"
when abbrev('DELISLE' , yU,3) then sn= "DELISLE"
when abbrev('DELISLE-OLD' , yU,8) |
abbrev('OLDDELISLE' , yU,6) |
abbrev('DELISLEOLD' , yU,8) then sn= "DELISLE OLD"
when abbrev('DELUC' , yU,4) |
abbrev('LUC' , yU,2) |
abbrev('DE-LUC' , yU,5) then sn= "DE LUC"
when abbrev('DELYON' , yU,4) |
abbrev('LYON' , yU,2) |
abbrev('DE-LYON' , yU,5) then sn= "DE LYON"
when abbrev('DEREVILLA' , yU,3) |
abbrev('DEREVILA' , yU,3) |
abbrev('REVILLA' , yU,3) |
abbrev('DE-REVILLA' , yU,4) |
abbrev('DE-REVILLA' , yU,5) then sn= "DE REVILLAS"
when abbrev('DEVILLENEUVE' , yU,3) |
abbrev('DE-VILLENEUVE' , yU,4) then sn= "DE VILLENEUVE"
when abbrev('DURHAM' , yU,3) |
abbrev('DERHAM' , yU,4) then sn= "DERHAM"
when abbrev('OLDDURHAM' , yU,5) |
abbrev('OLDDERHAM' , yU,6) |
abbrev('DERHAM-OLD' , yU,4) |
abbrev('DERHAMOLD' , yU,4) then sn= "DERHAM OLD"
when abbrev('DE-SUEDE' , yU,4) |
abbrev('DESUEDE' , yU,4) then sn= "DE SUEDE"
when abbrev('DU-CREST' , yU,2) |
abbrev('DUCREST' , yU,2) then sn= "DU CREST"
when abbrev('EDENBURGH' , yU,2) |
abbrev('EDINBURGH' , yU,2) then sn= "EDINBURGH"
when abbrev('EVOLT' , yU,2) |
abbrev('ELECTRONVOLT' , yU,2) then sn= "ELECTRON VOLTS"
when abbrev('FARENHEIT' , yU) |
abbrev('FARENHEIGHT' , yU) |
abbrev('FARENHITE' , yU) |
abbrev('FARENHIET' , yU) |
abbrev('FARHENHEIT' , yU) |
abbrev('FARINHEIGHT' , yU) |
abbrev('FARENHIGHT' , yU) |
abbrev('FAHRENHIET' , yU) |
abbrev('FERENHEIGHT' , yU) |
abbrev('FEHRENHEIT' , yU) |
abbrev('FERENHEIT' , yU) |
abbrev('FERINHEIGHT' , yU) |
abbrev('FARIENHEIT' , yU) |
abbrev('FARINHEIT' , yU) |
abbrev('FARANHITE' , yU) |
abbrev('FAHRENHEIT' , yU) then sn= "FAHRENHEIT"
when abbrev('OLDFAHRENHEIT' , yU,4) |
abbrev('FAHRENHEIT-OLD' , yU,13) |
abbrev('FAHRENHEITOLD' , yU,13) then sn= "FARHENHEIT OLD"
when abbrev('FLORENTINE-LARGE' , yU,12) |
abbrev('LARGE-FLORENTINE' , yU,7) |
abbrev('LARGEFLORENTINE' , yU,6) |
abbrev('FLORENTINELARGE' , yU,12) then sn= "FLORENTINE LARGE"
when abbrev('FLORENTINE-MAGNUM' , yU,2) |
abbrev('MAGNUM-FLORENTINE' , yU,3) |
abbrev('MAGNUMFLORENTINE' , yU,3) |
abbrev('FLORENTINEMAGNUM' , yU,2) then sn= "FLORENTINE MAGNUM"
when abbrev('FLORENTINE-SMALL' , yU,13) |
abbrev('SMALL-FLORENTINE' , yU,7) |
abbrev('SMALLFLORENTINE' , yU,6) |
abbrev('FLORENTINESMALL' , yU,13) then sn= "FLORENTINE SMALL"
when abbrev('FOULER' , yU,2) |
abbrev('FOWLOR' , yU,2) |
abbrev('FOWLER' , yU,2) then sn= "FOWLER"
when abbrev('FRICK' , yU,2) then sn= "FRICK"
when abbrev('GAS-MARK' , yU,2) |
abbrev('GASMARK' , yU,2) then sn= "GAS MARK"
when abbrev('GOUBERT' , yU,2) then sn= "GOUBERT"
when abbrev('HAIL' , yU,3) |
abbrev('HALE' , yU,3) then sn= "HALES"
when abbrev('HANOW' , yU,3) then sn= "HANOW"
when abbrev('HUCKSBEE' , yU,3) |
abbrev('HAWKSBEE' , yU,3) |
abbrev('HAUKSBEE' , yU,3) then sn= "HAUKSBEE"
when abbrev('JACOBSHOLBORN' , yU,2) |
abbrev('JACOBS-HOLBORN' , yU,2) then sn= "JACOBS-HOLBORN"
when abbrev('KALVIN' , yU) |
abbrev('KERLIN' , yU) |
abbrev('KEVEN' , yU) |
abbrev('KELVIN' , yU) then sn= "KELVIN"
when abbrev('LAYDEN' , yU) |
abbrev('LEIDEN' , yU) then sn= "LEIDEN"
when abbrev('NEUTON' , yU) |
abbrev('NEWTON' , yU) then sn= "NEWTON"
when abbrev('ORTEL' , yU) |
abbrev('OERTEL' , yU) then sn= "OERTEL"
when abbrev('PLACK' , yU) |
abbrev('PLANC' , yU) |
abbrev('PLANK' , yU) |
abbrev('PLANCK' , yU) then sn= "PLANCK"
when abbrev('RANKINE' , yU, 1) then sn= "RANKINE"
when abbrev('REAUMUR' , yU, 2) then sn= "REAUMUR"
when abbrev('RICKTER' , yU, 3) |
abbrev('RICHTER' , yU, 3) then sn= "RICHTER"
when abbrev('RINALDINI' , yU, 3) then sn= "RINALDINI"
when abbrev('ROEMER' , yU, 3) |
abbrev('ROMER' , yU, 3) then sn= "ROMER"
when abbrev('ROSANTHAL' , yU, 3) |
abbrev('ROSENTHAL' , yU, 3) then sn= "ROSENTHAL"
when abbrev('RSOL' , yU, 2) |
abbrev('RSL' , yU, 2) |
abbrev('ROYALSOCIETYOFLONDON' , yU, 3) |
abbrev('ROYAL-SOCIETY-OF-LONDON' , yU, 3) then sn= "ROYAL SOCIETY"
when abbrev('SAGREDO' , yU, 3) then sn= "SAGREDO"
when abbrev('ST.-PATRICE' , yU, 3) |
abbrev('ST.PATRICE' , yU, 3) |
abbrev('SAINTPATRICE' , yU, 3) |
abbrev('SAINT-PATRICE' , yU, 3) then sn= "SAINT-PATRICE"
when abbrev('STUFFE' , yU, 3) |
abbrev('STUFE' , yU, 3) then sn= "STUFE"
when abbrev('SULTZER' , yU, 2) |
abbrev('SULZER' , yU, 2) then sn= "SULZER"
when abbrev('WEDGEWOOD' , yU) |
abbrev('WEDGWOOD' , yU) then sn= "WEDGWOOD"
otherwise call serr 'illegal temperature scale:' y
end
return
?: parse arg y 1 yu
upper yu
if not\=='' then do
if noS\=="" then if left(yu, noL)==noS then return 0
if noE\=='' then if right(yu, noL)==noE then return 0
end
if all | y==! then return 1
return 0
commas: procedure; parse arg _
n= _'.9'
#= 123456789
b= verify(n, #, "M")
e= verify(n, #'0', , verify(n, #"0.", 'M') ) - 4
do j=e to b by -3
_= insert(",", _, j)
end
return _
sqrt: procedure; parse arg x
if x=0 then return 0
d= digits()
m.= 9
h= d+6
numeric form
numeric digits
parse value format(x, 2, 1, , 0) 'E0' with g "E" _ .
g=g * .5'e'_ % 2
do j=0 while h>9
m.j= h
h= h % 2 + 1
end
do k=j+5 to 0 by -1
numeric digits m.k
g= (g + x / g) * .5
end
return g / 1
?: parse arg y; if not\=='' then do; if noS\=="" then if left(y, noL)==noS then return 0; if noE\=='' then if right(y, noL)==noE then return 0; end; if all | y==! then return 1; return 0
e: e = 2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525166427427466391932; return e
isInt: return datatype(arg(1), 'W')
exp: procedure; parse arg x; ix=x%1; if abs(x-ix)>.5 then ix=ix+sign(x); x=x-ix; z=1; _=1; w=z; do j=1; _=_*x/j; z=(z+_)/1; if z==w then leave; w=z; end; if z\==0 then z= z * e()**ix; return z/1
ln: procedure; parse arg x; call e; ig=x>1.5; is=1-2*(ig\==1); ii=0; xx=x; return ln..()
ln..: do while ig & xx>1.5 | \ig & xx<.5;_=e;do k=-1;iz=xx*_**-is;if k>=0 & (ig & iz<1 | \ig & iz>.5) then leave;_=_*_;izz=iz;end;xx=izz; ii=ii+is*2**k; end; x=x*e**-ii-1; z=0;_=-1;p=z;do k=1; _=-_*x;z=z+_/k; if z=p then leave;p=z; end; return z+ii
pow: procedure; parse arg x,y; if y=0 then return 1; if x=0 then return 0; if isInt(y) then return x**y; if isInt(1/y) then return root(x,1/y,f); return pow.()
pow.: if abs(y//1)=.5 then return sqrt(x)**sign(y)*x**(y%1); return exp(y*ln(x))
root: procedure; parse arg x 1 ox,y 1 oy; if x=0 | y=1 then return x; if isInt(y) then return rooti(x,y); _=sqrt(x); if y<0 then _=1/_; return _
rooti: x=abs(x); y=abs(y); a= digits() + 5; g=rootIg(); m= y-1; d=5; do until d==a; d=min(d+d, a); numeric digits d; o=0; do until o=g; o=g; g=format( (m*g**y+x) /y/g**m, , d-2); end; end; _= g * sign(ox); if oy<0 then _= 1/_; return _
rootIg: numeric form;parse value format(x,2,1,,0) 'E0' with ? 'E' _ .; return (? / y'E'_ % y) + (x>1)
s: if arg(1)==1 then return arg(3); return word(arg(2) 's',1)
serr: say; say '***error***'; say; say arg(1); say; exit 13