eval执行含超大整数的长表达式时遇long_scalars溢出,求解决方法
问题原因
这个RuntimeWarning: overflow encountered in long_scalars警告,本质是表达式运算中使用了固定精度整数类型(比如numpy.int32),而运算结果超出了该类型的数值范围。Python原生int是任意精度的,不会出现溢出,所以问题大概率出在你的变量x1、x2...是低精度整数类型,或者表达式里硬编码了低精度整数转换。
解决方法
提前转换变量类型
如果x1、x2...是numpy数组,先把它们转成int64类型:import numpy as np x1 = x1.astype(np.int64) x2 = x2.astype(np.int64) # 其他变量同理若是单个变量,直接用Python原生int即可(无需手动转换,Python会自动处理超大整数)。
修改表达式中的数字定义
如果表达式里有硬编码的超大数字且指定了低精度类型(比如np.int32(12345678901234)),把这类代码改成np.int64(12345678901234),或者直接写数字字面量(Python会自动用原生任意精度int)。自定义eval的命名空间强制指定类型
给eval传入自定义的全局命名空间,把int映射为np.int64,让表达式里的整数转换都用int64:import numpy as np custom_globals = { '__builtins__': __builtins__, 'int': np.int64 } I = eval(string, custom_globals)这样表达式中所有
int()调用都会用int64执行,原生数字字面量也会和int64自动兼容运算,避免溢出。临时禁用警告(不推荐)
若你确认运算结果正确只是不想看到警告,可以临时屏蔽:import warnings warnings.filterwarnings('ignore', category=RuntimeWarning) I = eval(string)注意:这只是隐藏警告,没有解决溢出问题,可能导致结果失真,仅作临时应急用。
关于指定数据类型的问题
完全可以通过上述方法指定eval计算时的整数类型:要么提前把变量转成int64,要么通过自定义命名空间让表达式内的整数操作默认用int64,两种方式都能解决超大数字的溢出问题。
内容的提问来源于stack exchange,提问作者asdfgh

