Swift中inf的取值范围是多大?Double超10^220存为inf如何解决?
Double类型大数值溢出为inf问题解答
该问题是否仅对Double类型生效
所有遵循IEEE 754标准的浮点数类型都存在最大有限值上限,超出上限就会被存储为正无穷inf,该问题不是Double类型独有:
- 32位单精度浮点数
Float:最大正有限值约为3.4e+38,超出即溢出为inf - 64位双精度浮点数
Double:标准实现的最大正有限值约为1.8e+308,远高于你提到的10220阈值。如果你的场景中10220就触发inf,优先排查当前运行环境是否使用了裁剪版的浮点实现,或是大数值计算的中间步骤先发生了溢出 - 128位四精度浮点数:最大正有限值约为1.2e+4932,同样存在溢出阈值
溢出问题规避方案
- 更换更高精度的浮点类型
开发环境支持的前提下,可换用128位四精度浮点数(部分语言中命名为long double、Float128),可覆盖绝大多数大数值计算场景的需求。 - 使用任意精度数值类型
若数值上限不固定,可使用对应语言的任意精度数学库:比如Java的BigDecimal、Python内置的decimal模块、C++的GMP库等,这类类型没有固定的溢出阈值,只要内存足够就可以存储任意大小的精确数值,从根本上避免inf溢出问题。 - 对数缩放转换
如果场景仅需要做比值、幂次类计算,不需要保留原始数值的字面量,可以将所有数值先取对数存储,把乘除运算转换为加减运算,大幅降低溢出概率,该方案在机器学习、统计学等大数值计算场景中应用广泛。 - 增加溢出判断兜底
若必须使用Double类型,可以在大数值计算前后增加溢出校验,比如用isinf()类系统函数判断结果是否为无穷,提前做异常处理或截断操作。
内容的提问来源于stack exchange,提问作者Gabriel
相关产品推荐
相关产品推荐

