{
  "category": "Operators",
  "display_name": "Not equal to (<>)",
  "entry_kind": "built_in_operator",
  "eval_api": {
    "method": "POST",
    "url": "https://handbook.dnacalc.com/api/eval"
  },
  "function_id": "FUNC.OP_NOT_EQUAL",
  "implementation_state": {
    "answer_bank": null,
    "detail": "Recorded: 5 workbook cells.",
    "dnacalc_commit": "9e1884369a678158dd82d3d74188daf986995e87",
    "in_catalogue": true,
    "state": "matches",
    "state_label": "Matches every recorded Excel answer",
    "summary": "Matches all 5 recorded answers",
    "workbook_corpus": {
      "cells": 5,
      "matched": 5,
      "worst_ulp": 0
    }
  },
  "implementations": [
    {
      "commit": "9e1884369a678158dd82d3d74188daf986995e87",
      "flavour": "excel-compatibility-candidate",
      "language": "Rust",
      "name": "CalcFunc",
      "own_code": [
        "https://github.com/DnaCalc/DnaCalc/blob/9e1884369a678158dd82d3d74188daf986995e87/crates/calc-func/src/catalogue/comparison.rs#L57-L57",
        "https://github.com/DnaCalc/DnaCalc/blob/9e1884369a678158dd82d3d74188daf986995e87/crates/calc-func/src/catalogue/comparison.rs#L115-L126"
      ],
      "repository": "https://github.com/DnaCalc/DnaCalc",
      "shared_code": [
        "catalogue/comparison::compare",
        "catalogue/comparison::Operand::kind",
        "catalogue/comparison::Operand::blank",
        "catalogue/comparison::order",
        "catalogue/comparison::overflow_numbers",
        "catalogue/comparison::numbers",
        "catalogue/comparison::in_band",
        "catalogue/comparison::Rounded::up",
        "catalogue/comparison::Roundings::of",
        "catalogue/comparison::Roundings::disjoint",
        "catalogue/comparison::texts",
        "catalogue/comparison/collation::compare",
        "catalogue/comparison/collation::weighed",
        "catalogue/comparison/collation::measured_iteration_extension",
        "catalogue/comparison/sort_key::table",
        "catalogue/comparison/sort_key::decode64",
        "catalogue/comparison/sort_key::Reader::byte",
        "catalogue/comparison/sort_key::Reader::varint",
        "catalogue/comparison/sort_key::Reader::done",
        "catalogue/comparison/sort_key::in_ranges",
        "catalogue/comparison/sort_key::build",
        "catalogue/comparison/sort_key::han_base",
        "catalogue/comparison/sort_key::derive",
        "catalogue/comparison/sort_key::shared_jamo_tails",
        "catalogue/comparison/sort_key::ordinary_jamo_prefix",
        "catalogue/comparison/sort_key::independent_jamo_suffix",
        "catalogue/comparison/sort_key::jamo_leading_primary",
        "catalogue/comparison/sort_key::leading_order",
        "catalogue/comparison/sort_key::Before::separate_special",
        "catalogue/comparison/sort_key::Gathered::kana",
        "catalogue/comparison/sort_key::Gathered::unit",
        "catalogue/comparison/sort_key::parts",
        "catalogue/comparison/sort_key::diacritic_order",
        "catalogue/comparison/sort_key::diacritics",
        "decimal::low32",
        "decimal::Natural::from_u64",
        "decimal::Natural::pow10",
        "decimal::Natural::normalize",
        "decimal::Natural::is_zero",
        "decimal::Natural::mul_add_small",
        "decimal::Natural::times_pow10",
        "decimal::Natural::times_pow5",
        "decimal::Natural::times_pow2",
        "decimal::ExactDecimal::binary"
      ],
      "source": "https://github.com/DnaCalc/DnaCalc/blob/9e1884369a678158dd82d3d74188daf986995e87/crates/calc-func/src/catalogue/comparison.rs#L57-L57",
      "state": "matches",
      "suite": null,
      "summary": "Matches all 5 recorded answers"
    }
  ],
  "json_url": "https://handbook.dnacalc.com/api/functions/FUNC.OP_NOT_EQUAL.json",
  "name": "OP_NOT_EQUAL",
  "notes": [],
  "schema": "efh.function-reference/v1",
  "section_order": [
    "what-it-does",
    "try-it",
    "quirks",
    "how-to-implement",
    "version-differences",
    "alternatives"
  ],
  "sections": {
    "alternatives": "\n### Relationships\n\n\n- [`FUNC.OP_EQUAL`](FUNC.OP_EQUAL.md) — the rules this page inherits.\n- `NOT` — `NOT(A=B)` and `A<>B` agree on values and differ in error handling only in that\n  `NOT` will itself propagate the error it receives; both are error-transparent, but the\n  rewrite is worth stating deliberately rather than assuming.\n- `COUNTIF(range,\"<>\")`, `COUNTIFS`, `SUMIF` — the criteria mini-language, where the bare\n  string `\"<>\"` conventionally means \"not empty\". That is a criteria-parser convention\n  belonging to those functions, not a use of this operator, and its rules differ.\n- `EXACT` — for case-sensitive difference, `NOT(EXACT(a,b))` rather than `<>`.\n\n\n",
    "how-to-implement": "\n### Notes for implementers\n\n\n- Implement `<>` as the negation of the *same* equality routine `=` uses, not as an\n  independently written inequality. Two routines drift; one cannot.\n- Negate after the error check, never before. The error lane must short-circuit to the error\n  value, or the operator will report `TRUE` for comparisons involving errors.\n- In the array case, negate per coordinate, leaving `#N/A` padding as `#N/A` rather than\n  turning it into `TRUE`.\n\n\n",
    "quirks": "\n### Result and edge cases\n\n- **Different kinds.** Always `TRUE`, by the kind-ordering rule. A number is never equal to\n  text that looks like it, so it is always unequal to it.\n- **Blank operands.** The context-sensitive blank rule of the family applies: blank behaves\n  as `0` against a number, `\"\"` against text, `FALSE` against a logical. A blank cell is\n  therefore *not* unequal to `0` and *not* unequal to `\"\"`, though `0 <> \"\"` is `TRUE`.\n  Testing \"is this cell empty?\" with `<>\"\"` is consequently not a test for emptiness — it is\n  a test that is also satisfied by numeric zero in the blank case, and `ISBLANK` is the\n  function that means what the reader intended.\n- **Arrays.** Ordinary broadcast, `#N/A` for coordinates neither operand supplies.\n- **Errors.** Propagate; see above.\n\n\n\n### Errors\n\n\n| Error | Condition |\n|---|---|\n| any incoming error | Propagates unchanged, so `A<>B` is *not* guaranteed to be the logical negation of `A=B`. |\n| `#N/A` | Inside an array result only: a coordinate neither operand supplies. |\n\n`data/functions/FUNC.OP_NOT_EQUAL.json` records no Microsoft documentation URL (`docs` is\n`null`).\n\n\n",
    "sources": "- `data/presence/FUNC.OP_NOT_EQUAL.json` — implementing module\n  `earlier-implementation/operator_compare_concat_family.rs`.\n- Handbook `content/model/01-value-universe.md`, `02-coercion-and-lifting.md`,\n  `03-call-pipeline.md`, and this Handbook's [`FUNC.OP_EQUAL`](FUNC.OP_EQUAL.md) page for the\n  three comparison rules.\n\n",
    "version-differences": "No comparison between specific Excel builds is recorded here yet. This does not establish that all builds behave alike.",
    "what-it-does": "\n`A <> B` returns `TRUE` when the operands are *not* equal under Excel's comparison rules, and\n`FALSE` when they are.\n\nThe spelling is `<>`, not `!=` and not `≠`. Excel's grammar admits only the two-character\nform.\n\n\n\n### Arguments\n\n\n| Position | Name | Meaning |\n|---|---|---|\n| 0 | `A` | Left operand. Required. |\n| 1 | `B` | Right operand. Required. |\n\nArity is exactly 2; no optional arguments, no defaults. Symmetric in value, but the operand\npositions still set broadcast orientation for array operands.\n\n\n"
  },
  "signature": {
    "display": "value1 <> value2",
    "parameters": [
      {
        "description": null,
        "name": "value1",
        "optional": false,
        "repeats": false
      },
      {
        "description": null,
        "name": "value2",
        "optional": false,
        "repeats": false
      }
    ],
    "trailing_repeats": false
  },
  "sources": {
    "metadata": {
      "admission": {
        "label": "implemented",
        "reason": null
      },
      "arity": {
        "max": 2,
        "min": 2
      },
      "category": "Operators",
      "classification": {
        "arg_preparation_profile": "ValuesOnlyPreAdapter",
        "coercion_lift_profile": "Custom",
        "determinism_class": "Deterministic",
        "error_collapse_profile": "None",
        "fec_dependency_profile": "None",
        "host_interaction_class": "None",
        "kernel_signature_class": "Custom",
        "rich_value_usage": "RichBlind",
        "surface_fec_dependency_profile": "RefOnly",
        "thread_safety_class": "SafePure",
        "volatility_class": "NonVolatile"
      },
      "descriptions": {
        "long": null,
        "short": null,
        "short_source": "no-short-description"
      },
      "docs": null,
      "entry_kind": "built_in_operator",
      "localized_family_names": null,
      "localized_names": [],
      "signature": {
        "display": "value1 <> value2",
        "parameters": [
          {
            "description": null,
            "name": "value1",
            "optional": false,
            "repeats": false
          },
          {
            "description": null,
            "name": "value2",
            "optional": false,
            "repeats": false
          }
        ],
        "trailing_repeats": false
      },
      "surface_name": "OP_NOT_EQUAL",
      "version_marker": null,
      "xlcall": null
    },
    "microsoft": null
  },
  "try_it": {
    "formula": "=1<>2"
  },
  "url": "https://handbook.dnacalc.com/functions/OP_NOT_EQUAL.html",
  "variants": [],
  "versions": []
}