为何double.MaxValue加5不返回无穷大,两个double.MaxValue相加却返回无穷大
两个运算结果不同的核心原因:IEEE 754 双精度浮点数的精度规则与溢出判定逻辑
你用到的double类型完全遵循IEEE 754双精度浮点数标准,两个运算的差异来自该标准的两个核心特性:
- 浮点数采用相对精度设计,而非绝对精度
双精度浮点数仅保留53位二进制有效位,对应约16位十进制有效数字,数值越大,相邻两个可表示的浮点数的间隔(专业术语叫ULP,最小精度单位)就越大。double.MaxValue的数值约为1.7976931348623157E+308,在这个量级下,两个相邻可表示的double值的间隔已经远大于5。执行double.MaxValue + 5运算时,增量5太小不足以让数值跳到下一个可表示的浮点数区间,会按照默认舍入规则直接保留为double.MaxValue,没有达到溢出阈值,因此不会返回无穷大。 - 只有运算结果超出双精度浮点数可表示的最大有限值范围时,才会触发正溢出返回正无穷
两个
double.MaxValue相加的结果约为3.59E+308,已经远大于双精度浮点数能承载的最大有限值,满足溢出判定条件,因此按照IEEE 754标准规则直接返回正无穷。
内容的提问来源于stack exchange,提问作者azuremycraj
相关产品推荐
相关产品推荐

