【问题标题】:How to set the precision of a 'rug::float' above the i32 that the precision parm takes in rust如何设置精度参数在 rust 中的 i32 之上的 \'rug::float\' 的精度
【发布时间】:2022-08-22 10:45:18
【问题描述】:

我正在使用 rug a cargo create 为 rust 编程语言计算非常不建议大数字,rug 应该是任意精度但是当我去设置我的rug::Float 的精度时使用rug::Float::with_val (prec i32: [some value larger than i32 can hold], val Integer: some rug::Integer) rust panics 因为我的精度是太高了见下面的代码

fn main () {
    use rug::{Complete, Float, Integer};
    let _num = Integer::from(103204)
    let _float = Float::with_val(10000000000, _num

}

这种不令人惊讶的结果是我的精确度的恐慌,第一个婴儿车到 with_val 比 i32 可以容纳的更大,但是地毯被认为是任意精度,所以我的问题是如何创建一个具有更高精度的浮点数i32的最大值?

【问题讨论】:

    标签: rust precision rust-cargo gmp


    【解决方案1】:

    underlying MPFR library 支持最大精度

    浮点数或简称浮点数,是具有有限精度指数的任意精度有效数(也称为尾数)。...

    精度是用来表示浮点数的有效位的位数;对应的 C 数据类型是 mp_prec_t。精度可以是 MPFR_PREC_MIN 和MPFR_PREC_MAX.在当前实现中,MPFR_PREC_MIN 等于 2。

    它看起来是 u32::MAX 参见doc here

    您确定需要 2147483647 位的精度吗?我怀疑你没有。请记住,普通的 double 具有 53 位精度。所以你要求超过一百万倍的精度。精度不是您可以表示的最大数字,而是用于存储值的位数.

    特别是 53 位的精度,mpfr 应该能够准确地再现所有具有双精度机器浮点数的计算(C 中的 double 类型)

    如果您真的想要最大精度,请执行以下操作:

    use rug::{Complete, Float, Integer};
    let _num = Integer::from(103204);
    let _float = Float::with_val(u32::MAX, _num);
    

    【讨论】:

    • 非常感谢,但我需要小数点后大约 35 万亿位,
    • 生锈的地毯有可能吗?
    • 35万亿位数。我们称它为 3 位到一个数字(保守的)105T 位。 (105000000000000)/8/1024/1024/1024/1024 给我们至少 12 TB 来存储该数字。你有那么多磁盘空间吗?
    • 是的,我有大约 60 tb 可以使用!
    • 所以不可能获得比 i32 的最大值更高的精度?