{
  "id": "true-position",
  "version": "8e6a733e70ce",
  "status": "published",
  "name": "True Position Calculator",
  "question": "What is the true position?",
  "summary": "True position calculator for GD&T: the position deviation 2 × √(dx² + dy²) of a hole or pin from its basic location, with the bonus tolerance at MMC and a pass or fail against the position tolerance.",
  "category": "physics",
  "subcategory": "mechanics",
  "url": "https://www.acalculator.org/physics/true-position-calculator",
  "markdown": "https://www.acalculator.org/physics/true-position-calculator.md",
  "kind": "function",
  "method": "dx = measured X − basic X; dy = measured Y − basic Y; true position = 2 × √(dx² + dy²). Allowed = tolerance + bonus, with bonus = measured − MMC size (hole) or MMC size − measured (pin) at MMC, and 0 at RFS. Pass when true position ≤ allowed.",
  "assumptions": [
    "A 2D position of a round feature with a diameter (⌀) tolerance zone; the datums set the basic X and Y.",
    "The measured size is within the size limits; a hole below MMC or a pin above MMC has no answer."
  ],
  "inputs": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
      "bx": {
        "title": "Basic X",
        "description": "The X coordinate of the true (basic) position on the drawing.",
        "type": [
          "number",
          "string"
        ],
        "x-quantity": "length",
        "minimum": -10,
        "maximum": 10
      },
      "by": {
        "title": "Basic Y",
        "description": "The Y coordinate of the true (basic) position on the drawing.",
        "type": [
          "number",
          "string"
        ],
        "x-quantity": "length",
        "minimum": -10,
        "maximum": 10
      },
      "mx": {
        "title": "Measured X",
        "description": "The X coordinate of the measured centre of the feature.",
        "type": [
          "number",
          "string"
        ],
        "x-quantity": "length",
        "minimum": -10,
        "maximum": 10
      },
      "my": {
        "title": "Measured Y",
        "description": "The Y coordinate of the measured centre of the feature.",
        "type": [
          "number",
          "string"
        ],
        "x-quantity": "length",
        "minimum": -10,
        "maximum": 10
      },
      "tol": {
        "title": "Position tolerance",
        "description": "The diameter of the position tolerance zone in the feature control frame.",
        "type": [
          "number",
          "string"
        ],
        "x-quantity": "length",
        "exclusiveMinimum": 0,
        "maximum": 10
      },
      "mc": {
        "title": "Material condition",
        "description": "RFS (no modifier), or MMC (Ⓜ) on a hole or on a pin, which adds a bonus tolerance.",
        "type": "string",
        "enum": [
          "rfs",
          "hole",
          "pin"
        ]
      },
      "mmc": {
        "title": "MMC size",
        "description": "The maximum material size: the smallest hole or the largest pin the size limits allow.",
        "type": [
          "number",
          "string"
        ],
        "x-quantity": "length",
        "exclusiveMinimum": 0,
        "maximum": 10
      },
      "size": {
        "title": "Measured size",
        "description": "The measured diameter of the hole or pin.",
        "type": [
          "number",
          "string"
        ],
        "x-quantity": "length",
        "exclusiveMinimum": 0,
        "maximum": 10
      }
    }
  },
  "outputs": {
    "position": {
      "label": "True position",
      "description": "The position deviation as a diameter: 2 × √(dx² + dy²).",
      "format": "quantity",
      "unit": "in"
    },
    "verdict": {
      "label": "Result",
      "description": "Pass when the true position is at most the allowed tolerance.",
      "format": "text"
    },
    "allowed": {
      "label": "Allowed tolerance",
      "description": "The position tolerance plus any bonus tolerance.",
      "format": "quantity",
      "unit": "in"
    },
    "bonus": {
      "label": "Bonus tolerance",
      "description": "At MMC: the measured size − MMC size for a hole, MMC size − measured size for a pin.",
      "format": "quantity",
      "unit": "in"
    },
    "margin": {
      "label": "Margin",
      "description": "Allowed tolerance − true position; negative when the feature fails.",
      "format": "quantity",
      "unit": "in"
    },
    "dx": {
      "label": "X deviation (dx)",
      "description": "Measured X − basic X.",
      "format": "quantity",
      "unit": "in"
    },
    "dy": {
      "label": "Y deviation (dy)",
      "description": "Measured Y − basic Y.",
      "format": "quantity",
      "unit": "in"
    },
    "radial": {
      "label": "Radial distance",
      "description": "The distance from the basic position to the measured centre: √(dx² + dy²).",
      "format": "quantity",
      "unit": "in"
    }
  },
  "defaultAnswer": {
    "inputs": {
      "bx": "1 in",
      "by": "1 in",
      "mx": "1.003 in",
      "my": "0.996 in",
      "tol": "0.010 in",
      "mc": "rfs",
      "mmc": "0.250 in",
      "size": "0.254 in"
    },
    "outputs": {
      "position": 0.000254,
      "verdict": "Pass",
      "allowed": 0.000254,
      "bonus": 0,
      "margin": 0,
      "dx": 0.0000762,
      "dy": -0.0001016,
      "radial": 0.000127
    },
    "text": "The true position is 0.01 in: Pass against an allowed 0.01 in."
  },
  "examples": [
    {
      "given": {
        "bx": 0.0254,
        "by": 0.0254,
        "mx": 0.025476199999999997,
        "my": 0.0252984,
        "tol": 0.000254,
        "mc": "rfs"
      },
      "expect": {
        "position": 0.000254,
        "verdict": "Pass",
        "margin": 0,
        "radial": 0.000127
      },
      "source": "GD&T Basics, True Position – Position Tolerance (position = 2 × √(dx² + dy²); bonus tolerance = measured hole size − MMC hole size), https://www.gdandtbasics.com/true-position/ (retrieved 2026-10-05); hand calculation in content.mdx: 2 × √(0.003² + 0.004²) = 2 × 0.005 = 0.010 in, equal to the 0.010 in tolerance, so it passes",
      "tolerance": 1e-12
    },
    {
      "given": {
        "bx": 0.0254,
        "by": 0.0254,
        "mx": 0.025476199999999997,
        "my": 0.0252984,
        "tol": 0.0002032,
        "mc": "hole",
        "mmc": 0.00635,
        "size": 0.0064516
      },
      "expect": {
        "position": 0.000254,
        "bonus": 0.0001016,
        "allowed": 0.0003048,
        "verdict": "Pass"
      },
      "source": "GD&T Basics, True Position – Position Tolerance (position = 2 × √(dx² + dy²); bonus tolerance = measured hole size − MMC hole size), https://www.gdandtbasics.com/true-position/ (retrieved 2026-10-05); hand calculation in content.mdx: bonus 0.254 − 0.250 = 0.004 in; allowed 0.008 + 0.004 = 0.012 in ≥ 0.010 in",
      "tolerance": 1e-12
    },
    {
      "given": {
        "bx": 0.05,
        "by": 0.02,
        "mx": 0.0501,
        "my": 0.0201,
        "tol": 0.0002,
        "mc": "pin",
        "mmc": 0.01,
        "size": 0.00995
      },
      "expect": {
        "position": 0.000282842712474619,
        "bonus": 0.00005,
        "allowed": 0.00025,
        "verdict": "Fail"
      },
      "source": "GD&T Basics, True Position – Position Tolerance (position = 2 × √(dx² + dy²); bonus tolerance = measured hole size − MMC hole size), https://www.gdandtbasics.com/true-position/ (retrieved 2026-10-05) (for a pin the bonus is MMC − measured size); hand calculation in content.mdx: 2 × √(0.1² + 0.1²) = 0.28284 mm; allowed 0.2 + 0.05 = 0.25 mm, so it fails",
      "tolerance": 1e-9
    }
  ],
  "sources": [
    "GD&T Basics, True Position – Position Tolerance: position = 2 × √(dx² + dy²) and bonus tolerance from the departure from MMC, retrieved 2026-10-05. https://www.gdandtbasics.com/true-position/",
    "NIST Special Publication 811 (2008), Appendix B.8: 1 in = 25.4 mm exactly, retrieved 2026-10-05. https://www.nist.gov/pml/special-publication-811"
  ],
  "related": [
    "center-of-mass",
    "percent-error"
  ],
  "changelog": []
}
