为何计算地平线距离的代码在64米及以上触发Invalid Floating Point Operation错误?
错误原因分析
核心问题:整数溢出引发根号下出现负数
代码中存在两个连锁问题,最终导致高度≥64米时触发Invalid Floating Point Operation错误:
整数类型溢出
代码里用StrToInt(Edit1.Text)将输入的高度转为Integer类型(Delphi默认32位Integer的取值范围是-2147483648 ~ 2147483647)。当高度≥64米时,6350000 + StrToInt(Edit1.Text)的结果为6350064,对这个数做平方运算得到6350064² = 40323312804096,该数值远大于32位Integer的最大值,直接触发整数溢出。由于32位有符号整数溢出会按补码循环,溢出后的平方结果会变成负数。根号下出现非法负数
溢出得到的负数减去SQR(6350000)(同样因超大值溢出为负数,两者相减后结果仍为负数),导致SQRT()函数的参数为负数。而平方根函数仅能处理非负数,因此触发无效浮点操作错误。
验证示例(以64米为例)
- 计算
6350000 + 64 = 6350064 - 6350064的平方远超32位
Integer上限,溢出后结果为负数 - 代入公式得到
SQRT(负数 - 正数),根号内为负数,触发错误
修复方向
- 改用
StrToFloat替代StrToInt,将高度转为浮点类型参与计算,避免整数溢出 - 先将地球半径
6350000转为浮点类型,确保所有运算在浮点域进行
内容的提问来源于stack exchange,提问作者SangPro
相关产品推荐
相关产品推荐

