log
2026/4/14大约 4 分钟
最后同步日期:2026-04-15 | Godot 官方原文 — log
log
定义
log() 是自然对数函数——它回答的问题是:"e 的几次方等于这个数?"换句话说,它是 exp() 的逆运算。
对数可以理解为"反过来看指数":如果 e^3 ≈ 20.09,那么 log(20.09) ≈ 3。就像"存钱"和"取钱"的关系——exp 是存入指数得到结果,log 是取出结果还原指数。
打个生活中的比方:想象你有一笔按复利增长的存款,年利率是 100%(每年翻 e 倍)。你现在有 20 万,想知道这是存了多少年的结果?log(20) ≈ 3,答案就是大约 3 年。
在游戏开发中,自然对数常用于:计算声音的分贝值、实现非线性缩放(如经验值升级曲线)、衰减公式、将乘法关系转化为加法关系等。
函数签名
C#
public static float Log(float s)GDScript
func log(x: float) -> float参数说明
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
s / x | float | 是 | 要求对数的正数。必须大于 0,传入 0 或负数会返回 NaN |
返回值
float —— x 的自然对数值(以 e 为底)。
常见对应关系:
| 输入 | 输出 | 说明 |
|---|---|---|
| 1.0 | 0.0 | e^0 = 1,所以 log(1) = 0 |
| 2.718... | 1.0 | e^1 = e,所以 log(e) = 1 |
| 7.389... | 2.0 | e^2 ≈ 7.389,所以 log(7.389) ≈ 2 |
| 0.5 | -0.693... | 0~1 之间的数,对数为负 |
代码示例
C#
// ===== 基础用法 =====
float a = Mathf.Log(1.0f);
// 运行结果: a = 0.0(e^0 = 1,所以 log(1) = 0)
float b = Mathf.Log(2.718282f);
// 运行结果: b = 1.0(e^1 ≈ 2.718,所以 log(e) ≈ 1)
float c = Mathf.Log(7.389056f);
// 运行结果: c = 2.0(e^2 ≈ 7.389,所以 log(7.389) ≈ 2)
float d = Mathf.Log(0.5f);
// 运行结果: d = -0.693147(0~1 之间的数,对数为负)
// ===== 实际场景:计算以其他底数的对数 =====
// 公式: log_b(x) = log(x) / log(b)
// 比如计算以 10 为底的对数:
float log10_100 = Mathf.Log(100f) / Mathf.Log(10f);
// 运行结果: log10_100 = 2.0(10^2 = 100)
// 计算以 2 为底的对数:
float log2_8 = Mathf.Log(8f) / Mathf.Log(2f);
// 运行结果: log2_8 = 3.0(2^3 = 8)
float log2_1024 = Mathf.Log(1024f) / Mathf.Log(2f);
// 运行结果: log2_1024 = 10.0(2^10 = 1024)
// ===== 进阶用法:非线性经验值系统 =====
// 使用对数让前期升级快、后期升级慢
using Godot;
public partial class XpSystem : Node
{
[Export] public int ExBaseXp = 100;
// 根据经验值反推当前等级
public int GetLevelFromXp(int totalXp)
{
if (totalXp <= 0) return 1;
// level = base_level + log(totalXp / base_xp)
int level = 1 + (int)Mathf.Log(totalXp / (float)ExBaseXp + 1);
return level;
}
public override void _Ready()
{
GD.Print($"100 经验 → 等级: {GetLevelFromXp(100)}");
// 运行结果: 100 经验 → 等级: 2
GD.Print($"1000 经验 → 等级: {GetLevelFromXp(1000)}");
// 运行结果: 1000 经验 → 等级: 3
GD.Print($"10000 经验 → 等级: {GetLevelFromXp(10000)}");
// 运行结果: 10000 经验 → 等级: 5
}
}GDScript
# ===== 基础用法 =====
var a = log(1.0)
# 运行结果: a = 0.0(e^0 = 1,所以 log(1) = 0)
var b = log(2.718282)
# 运行结果: b = 1.0(e^1 ≈ 2.718,所以 log(e) ≈ 1)
var c = log(7.389056)
# 运行结果: c = 2.0(e^2 ≈ 7.389,所以 log(7.389) ≈ 2)
var d = log(0.5)
# 运行结果: d = -0.693147(0~1 之间的数,对数为负)
# ===== 实际场景:计算以其他底数的对数 =====
# 公式: log_b(x) = log(x) / log(b)
# 比如计算以 10 为底的对数:
var log10_100 = log(100) / log(10)
# 运行结果: log10_100 = 2.0(10^2 = 100)
# 计算以 2 为底的对数:
var log2_8 = log(8) / log(2)
# 运行结果: log2_8 = 3.0(2^3 = 8)
var log2_1024 = log(1024) / log(2)
# 运行结果: log2_1024 = 10.0(2^10 = 1024)
# ===== 进阶用法:非线性经验值系统 =====
# 使用对数让前期升级快、后期升级慢
@export var ex_base_xp: int = 100
# 根据经验值反推当前等级
func get_level_from_xp(total_xp: int) -> int:
if total_xp <= 0:
return 1
# level = base_level + log(total_xp / base_xp)
var level = 1 + int(log(total_xp / float(ex_base_xp) + 1))
return level
func _ready():
print("100 经验 → 等级: %d" % get_level_from_xp(100))
# 运行结果: 100 经验 → 等级: 2
print("1000 经验 → 等级: %d" % get_level_from_xp(1000))
# 运行结果: 1000 经验 → 等级: 3
print("10000 经验 → 等级: %d" % get_level_from_xp(10000))
# 运行结果: 10000 经验 → 等级: 5注意事项
- 参数必须大于 0。传入 0 或负数会返回
NaN(非数字)。这是因为不存在任何实数 x 使得 e^x ≤ 0。 - 如果需要计算以其他数为底的对数,使用公式
log_b(x) = log(x) / log(b)。例如以 2 为底:log(8) / log(2)=3.0;以 10 为底:log(100) / log(10)=2.0。 - 注意区分 GDScript 中的
log()(数学对数)和print()(输出日志)——它们是完全不同的功能。log是数学函数,不是"打印日志"。 - exp 和 log 互为反函数:
log(exp(x)) == x,exp(log(x)) == x(x > 0 时)。这个关系在数学推导中非常常用。 - C# 中可使用
Mathf.Log()(返回 float)或System.Math.Log()(返回 double),功能相同但精度不同。
