You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何计算地平线距离的代码在64米及以上触发Invalid Floating Point Operation错误?

错误原因分析

核心问题:整数溢出引发根号下出现负数

代码中存在两个连锁问题,最终导致高度≥64米时触发Invalid Floating Point Operation错误:

  1. 整数类型溢出
    代码里用StrToInt(Edit1.Text)将输入的高度转为Integer类型(Delphi默认32位Integer的取值范围是-2147483648 ~ 2147483647)。当高度≥64米时,6350000 + StrToInt(Edit1.Text)的结果为6350064,对这个数做平方运算得到6350064² = 40323312804096,该数值远大于32位Integer的最大值,直接触发整数溢出。由于32位有符号整数溢出会按补码循环,溢出后的平方结果会变成负数。

  2. 根号下出现非法负数
    溢出得到的负数减去SQR(6350000)(同样因超大值溢出为负数,两者相减后结果仍为负数),导致SQRT()函数的参数为负数。而平方根函数仅能处理非负数,因此触发无效浮点操作错误。

验证示例(以64米为例)

  • 计算6350000 + 64 = 6350064
  • 6350064的平方远超32位Integer上限,溢出后结果为负数
  • 代入公式得到SQRT(负数 - 正数),根号内为负数,触发错误

修复方向

  • 改用StrToFloat替代StrToInt,将高度转为浮点类型参与计算,避免整数溢出
  • 先将地球半径6350000转为浮点类型,确保所有运算在浮点域进行

内容的提问来源于stack exchange,提问作者SangPro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 00:24:17