def _hashable_param(
    param_tuples: Iterable[tuple[str | sympy.Expr, value.Scalar | sympy.Expr]], precision=1e7
) -> frozenset[tuple[str, int | tuple[int, int]]]:
    """Hash circuit parameters using fixed precision.

    Circuit parameters can be complex but we also need to use them as
    dictionary keys. We secretly use these fixed-precision integers.
    """
    return frozenset(
        (k, _fix_precision(v, precision)) for k, v in param_tuples if isinstance(k, str)
    )
Hash circuit parameters using fixed precision.

    Circuit parameters can be complex but we also need to use them as
    dictionary keys. We secretly use these fixed-precision integers.
    
cirq-core/cirq/work/observable_settings.py