【问题标题】:Raising an integer to a fractional power将整数提高到分数幂
【发布时间】:2021-09-09 21:09:38
【问题描述】:

我有代码:

(i as f64).powf(2.0 / 5.0).floor() as u64

有没有一种方法可以在不使用浮点的情况下将整数提高到分数幂?

(我可以执行两个单独的整数幂运算。它会溢出或丢失很多精度,具体取决于顺序。)

【问题讨论】:

  • 除了最终结果不能以整数表示的情况外,您预计在什么情况下会丢失精度?
  • 如果我做了i.pow(1/5).pow(2),那么i.pow(1.5) 将是一个整数,因此会在被提升到五次方之前向下舍入。
  • 但是i 的什么值会使i^(2/5) 成为整数,而i^(1/5) 不会成为整数?
  • 我想有效地应用.floor() 功率计算之后。 i 是任何整数,而不仅仅是整数的五次方根。
  • 在这种情况下,我怀疑你会找到任何东西。除了调整奇异的数据结构和算法之外,截断期望并不是一种广泛需要的操作,其中 FP 的有限速度/不精确性对于理论保证并不重要。

标签: rust exponent


【解决方案1】:

使用num crate 避免精度损失:

use num::{BigUint, ToPrimitive};

BigUint::from(base)
    .pow(exp_num)
    .nth_root(exp_den)
    .to_u64() // `.try_into()` works too -- import `TryInto` instead of `ToPrimitive`
    .expect("result overflows u64")

(playground)

要达到完全的准确性,除了使用大整数之外,您无能为力,所以如果您真的需要精度,那就去吧。不过要注意性能——当指数的分子或分母很大时,这种计算非常昂贵。

【讨论】:

    猜你喜欢
    • 2015-11-17
    • 1970-01-01
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多