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