#no-alloc #square-root #split #product-log #omega-function

no-std lambert_w

使用T. Fukushima方法快速准确地评估Lambert W函数。

19个版本 (4个破坏性)

0.5.3 2024年8月9日
0.5.2 2024年8月6日
0.4.4 2024年8月2日
0.4.0 2024年7月31日
0.1.1 2024年7月28日

#142 in 数学

Download history 503/week @ 2024-07-27 491/week @ 2024-08-03 189/week @ 2024-08-10 55/week @ 2024-08-17

1,238 每月下载量
5 个crate中使用了(直接使用2个)

MIT/Apache

80KB
2K SLoC

lambert_w

Static Badge Crates.io Version docs.rs GitHub Actions Workflow Status

使用Toshio Fukushima方法快速评估Lambert W函数的主分支和次分支的实值部分,精确到24或50位。

该方法通过将函数的定义域分割成子域,并在每个子域中使用输入值的简单变换上的有理函数来描述函数。
在代码中,它通过输入值的条件切换,然后是平方根(可能还有除法)、对数,然后是一系列的乘法和加法固定常数的操作,并以除法结束。

具有50位精度的函数使用有理函数中的更高次数的多项式,因此有更多的乘法和加法固定常数操作。

#![no_std] 兼容。

示例

使用Lambert W函数的主分支计算Omega常数的值,精确到50位

use lambert_w::lambert_w0;

let Ω = lambert_w0(1.0);

assert_abs_diff_eq!(Ω, 0.5671432904097838);

或者只精确到24位,但执行时间更快

use lambert_w::sp_lambert_w0;

let Ω = sp_lambert_w0(1.0);

assert_abs_diff_eq!(Ω, 0.5671432904097838, epsilon = 1e-7);

在-ln(2)/2处评估Lambert W函数的次分支,精确到50和24位

use lambert_w::{lambert_wm1, sp_lambert_wm1};

let z = -f64::ln(2.0) / 2.0;

let mln4_50b = lambert_wm1(z);
let mln4_24b = sp_lambert_wm1(z);


assert_abs_diff_eq!(mln4_50b, -f64::ln(4.0));
assert_abs_diff_eq!(mln4_24b, -f64::ln(4.0), epsilon = 1e-9);

许可证

根据您的选择,许可协议为

贡献

除非您明确说明,否则您根据Apache-2.0许可证定义的任何有意提交的工作,将按照上述方式双重许可,不附加任何额外条款或条件。

依赖关系

~440KB