📄 Calc-rpn1-code.txt
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>RPN Scientific</title>
<style>
*{margin:0;padding:0;box-sizing:border-box;-webkit-tap-highlight-color:transparent}
html,body{height:100%;background:#0d1117;font-family:'Consolas','Courier New',monospace;color:#e6edf3;user-select:none;-webkit-user-select:none;overflow:hidden}
body{display:flex;justify-content:center;align-items:flex-start;padding:8px}
.calc{background:#161b22;border-radius:14px;padding:12px;width:100%;max-width:400px;box-shadow:0 4px 24px rgba(0,0,0,.5)}
.hdr{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px;padding:0 2px}
.ttl{font-size:13px;color:#6e7681;letter-spacing:2px}
.mds{display:flex;gap:1px;background:#21262d;border-radius:5px;padding:2px}
.mb{padding:3px 8px;font-size:11px;font-weight:bold;border:none;border-radius:3px;cursor:pointer;background:transparent;color:#6e7681;font-family:inherit}
.mb.a{background:#d29922;color:#0d1117}
.dsp{background:#0d1117;border:1px solid #30363d;border-radius:8px;padding:10px 14px;margin-bottom:10px}
.sl{display:flex;justify-content:space-between;align-items:baseline;height:26px;line-height:26px}
.lb{font-size:12px;color:#484f58;width:24px}
.lb.x{color:#7ee787}
.sv{font-size:16px;color:#8b949e;text-align:right;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sv.x{color:#ffd700;font-size:18px}
.g{display:grid;grid-template-columns:repeat(5,1fr);gap:5px}
.b{border:none;border-radius:7px;padding:12px 2px;font-size:13px;font-weight:600;font-family:inherit;cursor:pointer;color:#c9d1d9;background:#2d333b;transition:transform .05s;touch-action:manipulation}
.b:active{transform:scale(.94);filter:brightness(1.2)}
.b.n{background:#3d444d;font-size:17px;color:#e6edf3}
.b.o{background:#6b5b1a;color:#ffd700;font-size:17px}
.b.e{background:#196c2e;color:#7ee787;font-size:14px;font-weight:bold}
.b.d{background:#5c2020;color:#f47067}
.b.s{background:#1a4040;color:#3dd6d6}
.b.c{color:#d2a8ff}
</style>
</head>
<body>
<div class="calc">
<div class="hdr">
<span class="ttl">RPN SCIENTIFIC</span>
<div class="mds">
<button class="mb a" id="mDEG" onclick="setA('DEG')">DEG</button>
<button class="mb" id="mRAD" onclick="setA('RAD')">RAD</button>
<button class="mb" id="mGRA" onclick="setA('GRA')">GRA</button>
</div>
</div>
<div class="dsp">
<div class="sl"><span class="lb">4 :</span><span class="sv" id="r4">0</span></div>
<div class="sl"><span class="lb">3 :</span><span class="sv" id="r3">0</span></div>
<div class="sl"><span class="lb">2 :</span><span class="sv" id="r2">0</span></div>
<div class="sl"><span class="lb x">1 :</span><span class="sv x" id="r1">0</span></div>
</div>
<div class="g">
<button class="b" onclick="uT(Math.sin)">SIN</button>
<button class="b" onclick="uT(Math.cos)">COS</button>
<button class="b" onclick="uT(Math.tan)">TAN</button>
<button class="b" onclick="uF(Math.sqrt)">√x</button>
<button class="b" onclick="uF(x=>x*x)">x²</button>
<button class="b" onclick="uI(Math.asin)">SIN⁻¹</button>
<button class="b" onclick="uI(Math.acos)">COS⁻¹</button>
<button class="b" onclick="uI(Math.atan)">TAN⁻¹</button>
<button class="b" onclick="bF(Math.pow)">yˣ</button>
<button class="b" onclick="uF(x=>1/x)">1/x</button>
<button class="b" onclick="uF(Math.log)">LN</button>
<button class="b" onclick="uF(Math.log10)">LOG</button>
<button class="b" onclick="uF(Math.exp)">eˣ</button>
<button class="b" onclick="uF(x=>Math.pow(10,x))">10ˣ</button>
<button class="b" onclick="nFact()">N!</button>
<button class="b c" onclick="pC(Math.PI)">π</button>
<button class="b c" onclick="pC(Math.E)">e</button>
<button class="b" onclick="rnd()">RND</button>
<button class="b" onclick="eex()">EEX</button>
<button class="b" onclick="chs()">+/−</button>
<button class="b n" onclick="dg('7')">7</button>
<button class="b n" onclick="dg('8')">8</button>
<button class="b n" onclick="dg('9')">9</button>
<button class="b o" onclick="bF((a,b)=>a/b)">÷</button>
<button class="b d" onclick="bks()">⌫</button>
<button class="b n" onclick="dg('4')">4</button>
<button class="b n" onclick="dg('5')">5</button>
<button class="b n" onclick="dg('6')">6</button>
<button class="b o" onclick="bF((a,b)=>a*b)">×</button>
<button class="b d" onclick="clx()">CLx</button>
<button class="b n" onclick="dg('1')">1</button>
<button class="b n" onclick="dg('2')">2</button>
<button class="b n" onclick="dg('3')">3</button>
<button class="b o" onclick="bF((a,b)=>a-b)">−</button>
<button class="b s" onclick="sw()">SWAP</button>
<button class="b n" onclick="dg('0')">0</button>
<button class="b n" onclick="dt()">.</button>
<button class="b e" onclick="en()">ENTER</button>
<button class="b o" onclick="bF((a,b)=>a+b)">+</button>
<button class="b s" onclick="dr()">DROP</button>
</div>
</div>
<script>
const P=12;
let S=[0,0,0,0],buf="",inp=false,lf=true,ex=false,exp="",ang="DEG";
function fmt(n){
if(typeof n!=='number'||isNaN(n))return"Error";
if(!isFinite(n))return n>0?"∞":"-∞";
if(n===0)return"0";
let a=Math.abs(n),s;
if(a>=1e-4&&a<1e12){
s=n.toPrecision(P);
if(s.includes('.')&&!s.includes('e'))s=s.replace(/0+$/,'').replace(/\.$/,'');
}else{
s=n.toExponential(P-1);
let p=s.split('e');
if(p[0].includes('.'))p[0]=p[0].replace(/0+$/,'').replace(/\.$/,'');
s=p[0]+'e'+p[1];
}
return s;
}
function upd(){
let x;
if(inp){x=ex?(buf||"0")+"e"+(exp||""):(buf||"0");}
else{x=fmt(S[0]);}
document.getElementById('r1').textContent=x;
document.getElementById('r2').textContent=fmt(S[1]);
document.getElementById('r3').textContent=fmt(S[2]);
document.getElementById('r4').textContent=fmt(S[3]);
}
function fin(){
if(inp){
let v;
if(ex)v=parseFloat((buf||"0")+"e"+(exp||"0"));
else v=parseFloat(buf||"0");
S[0]=isNaN(v)?0:v;inp=false;ex=false;exp="";buf="";
}
}
function li(){S[3]=S[2];S[2]=S[1];S[1]=S[0];}
function dp(){S[0]=S[1];S[1]=S[2];S[2]=S[3];}
function r12(v){return(!isFinite(v)||v===0)?v:parseFloat(v.toPrecision(P));}
function toR(x){return ang==="DEG"?x*Math.PI/180:ang==="GRA"?x*Math.PI/200:x;}
function frR(x){return ang==="DEG"?x*180/Math.PI:ang==="GRA"?x*200/Math.PI:x;}
function dg(d){
if(!inp){if(lf)li();buf="";ex=false;exp="";inp=true;}
if(ex){if(exp.replace('-','').length<3)exp+=d;}
else{if(buf==="0")buf=d;else if(buf==="-0")buf="-"+d;else buf+=d;}
let v;if(ex)v=parseFloat((buf||"0")+"e"+(exp||"0"));else v=parseFloat(buf||"0");
if(!isNaN(v))S[0]=v;lf=true;upd();
}
function dt(){
if(!inp){if(lf)li();buf="0";inp=true;}
if(!ex&&!buf.includes('.'))buf+='.';upd();
}
function en(){fin();li();lf=false;upd();}
function bks(){
if(inp){
if(ex){if(exp.length>0)exp=exp.slice(0,-1);else ex=false;}
else{buf=buf.slice(0,-1);if(!buf||buf==="-")buf="0";}
let v;if(ex)v=parseFloat((buf||"0")+"e"+(exp||"0"));else v=parseFloat(buf||"0");
if(!isNaN(v))S[0]=v;upd();
}
}
function clx(){S[0]=0;inp=false;buf="";ex=false;exp="";lf=false;upd();}
function sw(){fin();let t=S[0];S[0]=S[1];S[1]=t;lf=true;upd();}
function dr(){fin();dp();lf=true;upd();}
function chs(){
if(inp){
if(ex){exp=exp.startsWith('-')?exp.slice(1):'-'+exp;}
else{buf=buf.startsWith('-')?buf.slice(1):'-'+buf;}
let v;if(ex)v=parseFloat((buf||"0")+"e"+(exp||"0"));else v=parseFloat(buf||"0");
if(!isNaN(v))S[0]=v;upd();
}else{S[0]=-S[0];lf=true;upd();}
}
function eex(){
if(!inp){if(lf)li();buf="1";inp=true;}
if(!ex){ex=true;exp="";}upd();
}
function uF(fn){fin();S[0]=r12(fn(S[0]));lf=true;upd();}
function uT(fn){fin();S[0]=r12(fn(toR(S[0])));lf=true;upd();}
function uI(fn){fin();S[0]=r12(frR(fn(S[0])));lf=true;upd();}
function bF(fn){
fin();let x=S[0],y=S[1];
S[0]=r12(fn(y,x));S[1]=S[2];S[2]=S[3];lf=true;upd();
}
function nFact(){
fin();let n=Math.round(S[0]);
if(n<0||n>170){S[0]=NaN;}
else{let r=1;for(let i=2;i<=n;i++)r*=i;S[0]=r;}
lf=true;upd();
}
function rnd(){fin();S[0]=Math.round(S[0]);lf=true;upd();}
function pC(c){fin();if(lf)li();S[0]=c;lf=true;upd();}
function setA(m){
ang=m;document.querySelectorAll('.mb').forEach(b=>b.classList.remove('a'));
document.getElementById('m'+m).classList.add('a');
}
document.addEventListener('keydown',function(e){
let k=e.key;
if(k>='0'&&k<='9'){dg(k);e.preventDefault();}
else if(k==='.'){dt();e.preventDefault();}
else if(k==='Enter'){en();e.preventDefault();}
else if(k==='+'){bF((a,b)=>a+b);e.preventDefault();}
else if(k==='-'){bF((a,b)=>a-b);e.preventDefault();}
else if(k==='*'){bF((a,b)=>a*b);e.preventDefault();}
else if(k==='/'){bF((a,b)=>a/b);e.preventDefault();}
else if(k==='Backspace'){bks();e.preventDefault();}
else if(k==='Escape'||k==='Delete'){clx();e.preventDefault();}
});
upd();
</script>
</body>
</html>
® Ricerca indipendente di monseppe2