Chronaxis用户手册English
本页目录

chronaxis.core.expression_integer_reference

源码基线:8904c2f744951857659abd40aaa3535d57faf53c

1"""在单点64位整数与浮点输入上执行取余、位提取和精确转整数。23输入为已编译节点与typed标量元组。Python整数保存精确的中间数,4判定范围后才构造目标ScalarValue。转float复用公共精度检查。5"""67from .numeric import INTEGER_BOUNDS, ScalarValue8from .types import QualityFlag as Q91011def integer_reference(node, args):12    """在标量域执行节点,拒绝0除数、整型范围外或有小数部分的转换。1314    参数: node提供操作、静态dtype与必要的位范围,args为ScalarValue。15    返回: ScalarValue,质量非零时不产生有效值。16    异常: ValueError为未登记的内部操作;有效输入的数值失败写入质量。17    """18    quality = Q.NONE19    for arg in args:20        quality |= arg.quality21    if quality != Q.NONE:22        return ScalarValue(None, node.dtype, False, quality)23    value = args[0].value24    if node.operator == 'mod':25        divisor = args[1].value26        if divisor == 0:27            return ScalarValue(None, node.dtype, False, Q.DOMAIN_ERROR)28        # 原生整数余数随除数符号;INT64_MIN % -1为0,不构造越界商。29        result = value % divisor30    elif node.operator in ('bit_test', 'bit_extract'):31        # 即使原数为负,也只解释其低64位补码,bit0始终是最低位。32        start, width = node.value33        result = ((value & ((1 << 64) - 1)) >> start) & ((1 << width) - 1)34        if node.operator == 'bit_test':35            result = bool(result)36    elif node.operator in ('to_int64', 'to_uint64'):37        # 精确整数比较不把2^63-1或2^64-1先近似为float64。38        if type(value) is float and not value.is_integer():39            return ScalarValue(None, node.dtype, False, Q.PRECISION_LOSS)40        lo, hi = INTEGER_BOUNDS[node.dtype]41        if not lo <= value <= hi:42            return ScalarValue(None, node.dtype, False, Q.OVERFLOW)43        result = int(value)44    else:45        raise ValueError('未登记的整数操作')46    return ScalarValue(result, node.dtype)47
Chronaxis 用户手册 · 离线阅读