{
  "schemaVersion": 1,
  "slug": "standard-deviation-calculator",
  "category": "math",
  "kind": "implementation",
  "independentValidation": false,
  "implementationHash": "6da238a68892e9c8017bfa7a09ec07a9466b99e35c95c9d6ff9ca0966a82a763",
  "provenance": "Generated from the calculation contract used by the published page. Publication is not external validation.",
  "sourceFiles": [
    "data/calculators/standard-deviation-calculator.json",
    "src/engine.js"
  ],
  "runtimeSource": "/sources/engine.txt",
  "runtimeHash": "5c888d8898afbdee36267bb9977829e1e2ac568f6677c8ee87469c139864645c",
  "scope": "The compute function records implemented equations, constants, lookup tables and custom rules. Inputs record defaults and allowed values; outputs record precision and units. Defaults are examples, not recommendations. General background references are not evidence for this specific algorithm.",
  "publishedFormula": {
    "formula": "μ = Σx/n; σ² = Σ(x−μ)²/n; s² = Σ(x−μ)²/(n−1); σ = √σ²; s = √s²; SE = s/√n",
    "vars": [],
    "note": "The primary statistic can be switched. Unrepresentable numeric results are rejected; an overflowing sum of squares alone is omitted when the variance remains representable."
  },
  "externalEvidence": null,
  "contract": {
    "compute": "try{if(false)throw new Error('inputError');const calculate=function(){const h=(function context() {\n  const DAY=86400000;\n  const own=(o,k)=>Object.prototype.hasOwnProperty.call(o,k);\n  const fail=()=>{throw new Error('inputError');};\n  const num=(v,min=-Infinity,max=Infinity,integer=false)=>{\n    if(!Number.isFinite(v)||v<min||v>max||(integer&&!Number.isInteger(v)))fail();return v;\n  };\n  const choice=(v,values)=>{if(!values.includes(v))fail();return v;};\n  const date=s=>{if(typeof s!=='string'||!/^\\d{4}-\\d{2}-\\d{2}$/.test(s)||s.startsWith('0000'))fail();const d=new Date(s+'T00:00:00Z');if(!Number.isFinite(+d)||d.toISOString().slice(0,10)!==s)fail();return d;};\n  const iso=d=>{if(!Number.isFinite(+d)||d.getUTCFullYear()<1||d.getUTCFullYear()>9999)fail();return d.toISOString().slice(0,10);};\n  const shift=(d,n)=>{const r=new Date(+d+n*DAY);iso(r);return r;};\n  const month=(d,n)=>{const r=new Date(+d);r.setUTCDate(1);r.setUTCMonth(r.getUTCMonth()+n);const end=new Date(+r);end.setUTCMonth(end.getUTCMonth()+1,0);r.setUTCDate(Math.min(d.getUTCDate(),end.getUTCDate()));iso(r);return r;};\n  const weekdays=['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];\n  const work=(d,count)=>{let n=Math.floor(count/7)*5;for(let k=0;k<count%7;k++){const w=(d.getUTCDay()+k)%7;if(w!==0&&w!==6)n++;}return n;};\n  const wholeMonths=(a,b)=>{let n=(b.getUTCFullYear()-a.getUTCFullYear())*12+b.getUTCMonth()-a.getUTCMonth();if(n>=0&&+month(a,n)>+b)n--;if(n<0&&+month(a,n)<+b)n++;return n;};\n  return {DAY,own,fail,num,choice,date,iso,shift,month,weekdays,work,wholeMonths};\n})();const result=(function(v,h){\n    const {fail}=h,text=String(v.values).trim();if(!text||text.length>100000||/^,|,$|,\\s*,/.test(text))fail();const parts=text.split(/[\\s,]+/);if(parts.length>10000||!parts.every(x=>/^[+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[+-]?\\d+)?$/i.test(x)&&Number.isFinite(Number(x))))fail();\n    const xs=parts.map(Number),count=xs.length,origin=xs[0];let sum=0,err=0;for(const x of xs){const d=x-origin;if(!Number.isFinite(d))fail();const y=d-err,t=sum+y;err=(t-sum)-y;sum=t;}\n    const center=sum/count,mean=origin+center;if(!Number.isFinite(mean))fail();const scale=Math.max(...xs.map(x=>Math.abs((x-origin)-center)));let ss=0;err=0;if(scale)for(const x of xs){const d=((x-origin)-center)/scale,y=d*d-err,t=ss+y;err=(t-ss)-y;ss=t;}\n    const populationSD=scale*Math.sqrt(ss/count),sampleSD=count>1?scale*Math.sqrt(ss/(count-1)):null,populationVariance=populationSD**2,sampleVariance=count>1?sampleSD**2:null,sumSquares=scale**2*ss;\n    if(!Number.isFinite(populationVariance)||(scale>0&&populationVariance===0)||(sampleVariance!==null&&!Number.isFinite(sampleVariance)))fail();\n    return {populationSD,sampleSD,populationVariance,sampleVariance,mean,standardError:count>1?sampleSD/Math.sqrt(count):null,count,sumSquares:Number.isFinite(sumSquares)?sumSquares:null};\n  })({\"values\":(values),\"resultKind\":(resultKind)},h);return result;};const out=calculate();return Object.fromEntries([\"populationSD\",\"sampleSD\",\"populationVariance\",\"sampleVariance\",\"mean\",\"standardError\",\"count\",\"sumSquares\"].map(k=>[k,out[k]??null]).concat(Object.entries(out).filter(([k])=>k.startsWith('__'))));}catch(error){return Object.assign(Object.fromEntries([\"populationSD\",\"sampleSD\",\"populationVariance\",\"sampleVariance\",\"mean\",\"standardError\",\"count\",\"sumSquares\"].map(k=>[k,null])),{__error:error.message==='openingsExceedWallArea'?'openingsExceedWallArea':'inputError'});}",
    "inputs": [
      {
        "name": "values",
        "type": "text",
        "default": "10, 12, 23, 23, 16, 23, 21, 16",
        "step": 1,
        "preserveEmpty": true
      },
      {
        "type": "select",
        "default": "populationSD",
        "options": [
          {
            "value": "populationSD"
          },
          {
            "value": "sampleSD"
          },
          {
            "value": "populationVariance"
          },
          {
            "value": "sampleVariance"
          }
        ],
        "advanced": true,
        "name": "resultKind"
      }
    ],
    "outputs": [
      {
        "name": "populationSD",
        "precision": 4,
        "unit": "",
        "notation": "auto"
      },
      {
        "name": "sampleSD",
        "precision": 4,
        "unit": "",
        "optional": true,
        "notation": "auto"
      },
      {
        "name": "populationVariance",
        "precision": 4,
        "unit": "",
        "notation": "auto"
      },
      {
        "name": "sampleVariance",
        "precision": 4,
        "unit": "",
        "optional": true,
        "notation": "auto"
      },
      {
        "name": "mean",
        "precision": 4,
        "unit": "",
        "notation": "auto"
      },
      {
        "name": "standardError",
        "precision": 4,
        "unit": "",
        "optional": true,
        "notation": "auto"
      },
      {
        "name": "count",
        "precision": 0,
        "unit": "",
        "notation": "auto"
      },
      {
        "name": "sumSquares",
        "precision": 4,
        "unit": "",
        "optional": true,
        "notation": "auto"
      }
    ],
    "interpret": null
  }
}
