is_inf
2026/4/15大约 4 分钟
最后同步日期:2026-04-15 | Godot 官方原文 — is_inf
is_inf
定义
is_inf 是一个用来判断一个浮点数是否是无穷大(包括正无穷和负无穷)的函数。
无穷大是什么?打个比方:你在计算器上按 1 ÷ 0,计算器会显示"∞"(或者报错)。这个"∞"在编程世界里就是正无穷大(Infinity)。同样,-1 ÷ 0 会产生负无穷大(-Infinity)。
需要注意的是,is_inf 同时检测正无穷和负无穷——只要结果是任意一种无穷大,都返回 true。
什么时候需要用到它?
- 检测除法运算是否产生了无穷大(除数可能为零)
- 验证数学计算结果是否在合理范围内
- 防止无穷大值传入物理引擎或渲染系统导致异常行为
函数签名
C#
// 方式一:通过 Mathf 类调用(Godot 封装)
public static bool IsInf(float x)
// 方式二:使用 .NET 原生方法(同时检测正无穷和负无穷)
// float.IsInfinity(x)GDScript
# 全局函数,无需前缀直接调用
func is_inf(x: float) -> bool参数说明
| 参数名 | 类型 | 说明 |
|---|---|---|
x | float | 要检查是否为无穷大的浮点数 |
返回值
bool — 如果 x 是正无穷大(INF)或负无穷大(-INF),返回 true;否则返回 false。
代码示例
基本用法:检测无穷大
C#
using Godot;
public partial class MyNode : Node
{
public override void _Ready()
{
float a = 42.0f;
float b = float.PositiveInfinity; // 正无穷
float c = float.NegativeInfinity; // 负无穷
float d = 1.0f / 0.0f; // 除零产生正无穷
float e = float.NaN; // NaN 不是无穷大
GD.Print(Mathf.IsInf(a)); // 输出: False (正常的数)
GD.Print(Mathf.IsInf(b)); // 输出: True (正无穷)
GD.Print(Mathf.IsInf(c)); // 输出: True (负无穷)
GD.Print(Mathf.IsInf(d)); // 输出: True (1/0 产生正无穷)
GD.Print(Mathf.IsInf(e)); // 输出: False (NaN 不是无穷大)
}
}GDScript
extends Node
func _ready():
var a = 42.0
var b = INF # 正无穷
var c = -INF # 负无穷
var d = 1.0 / 0.0 # 除零产生正无穷
var e = NAN # NaN 不是无穷大
print(is_inf(a)) # 输出: False (正常的数)
print(is_inf(b)) # 输出: True (正无穷)
print(is_inf(c)) # 输出: True (负无穷)
print(is_inf(d)) # 输出: True (1/0 产生正无穷)
print(is_inf(e)) # 输出: False (NaN 不是无穷大)实际场景:防止无穷大进入物理系统
C#
using Godot;
public partial class Projectile : RigidBody3D
{
// 导出属性:最大速度限制
[Export] public float ExMaxSpeed = 100.0f;
// 导出属性:推力大小
[Export] public float ExThrustForce = 50.0f;
// 内部变量:推力方向
private Vector3 _thrustDirection = Vector3.Forward;
public override void _PhysicsProcess(double delta)
{
// 计算当前速度大小
float speed = LinearVelocity.Length();
// 检查速度是否变成无穷大(可能由异常碰撞等原因导致)
if (Mathf.IsInf(speed))
{
GD.PrintErr("速度值变为无穷大!强制重置速度为零");
LinearVelocity = Vector3.Zero;
return;
}
// 限制最大速度
if (speed > ExMaxSpeed)
{
LinearVelocity = LinearVelocity.Normalized() * ExMaxSpeed;
return;
}
// 施加推力
ApplyCentralForce(_thrustDirection * ExThrustForce);
}
}GDScript
extends RigidBody3D
# 导出属性:最大速度限制
@export var max_speed: float = 100.0
# 导出属性:推力大小
@export var thrust_force: float = 50.0
# 内部变量:推力方向
var _thrust_direction: Vector3 = Vector3.FORWARD
func _physics_process(delta):
# 计算当前速度大小
var speed = linear_velocity.length()
# 检查速度是否变成无穷大(可能由异常碰撞等原因导致)
if is_inf(speed):
push_error("速度值变为无穷大!强制重置速度为零")
linear_velocity = Vector3.ZERO
return
# 限制最大速度
if speed > max_speed:
linear_velocity = linear_velocity.normalized() * max_speed
return
# 施加推力
apply_central_force(_thrust_direction * thrust_force)注意事项
同时检测正无穷和负无穷:
is_inf对INF和-INF都返回true。如果你需要区分正无穷还是负无穷,可以用以下方式:if x == INF: print("这是正无穷") elif x == -INF: print("这是负无穷")NaN 不是无穷大:
is_inf(NaN)返回false。NaN 和无穷大是两种不同的异常状态——NaN 表示"无意义",无穷大表示"太大/太小"。检测 NaN 请使用is_nan。C# 中的命名差异:Godot 封装的
Mathf.IsInf(x)和 .NET 原生的float.IsInfinity(x)效果一样。注意名字不同——Godot 用IsInf,.NET 用IsInfinity。无穷大的常见来源:最常见的来源是除以零(
1.0 / 0.0 = INF)。在做除法运算时,如果除数可能为零,请务必做安全检查。无穷大会导致物理引擎崩溃:如果物体的位置、速度或力变成了无穷大,物理引擎会产生不可预期的行为。在关键计算节点使用
is_inf做安全检查是个好习惯。
