Math 在不使用较大容器的情况下乘以固定大小的分数
我得到了三个大小为128位的无符号数字:Math 在不使用较大容器的情况下乘以固定大小的分数,math,language-agnostic,numerical-methods,rust,Math,Language Agnostic,Numerical Methods,Rust,我得到了三个大小为128位的无符号数字:a、b和c,其中a和b问题最初被标记为,因此我在回答中假设,即使标记现在已被移除 正如其他人在评论中所说的那样,您将始终必须增大一个大小,否则您将面临乘法溢出的风险,除非您对这些数字大小的界限有一些保证。Rust中没有比u128更大的基元类型 通常的解决方案是切换到支持任意精度算法的结构,通常称为“bignums”或“bigints”。但是,它们的性能明显低于使用本机整数类型 在Rust中,您可以使用num bigint板条箱: extern板条箱数量;
a
、b
和c
,其中a
和b
问题最初被标记为,因此我在回答中假设,即使标记现在已被移除
正如其他人在评论中所说的那样,您将始终必须增大一个大小,否则您将面临乘法溢出的风险,除非您对这些数字大小的界限有一些保证。Rust中没有比u128更大的基元类型
通常的解决方案是切换到支持任意精度算法的结构,通常称为“bignums”或“bigints”。但是,它们的性能明显低于使用本机整数类型
在Rust中,您可以使用num bigint
板条箱:
extern板条箱数量;
使用num_bigint::BigUint;
fn main(){
设a:u128=234991231;
设b:u128=989087987;
设c:u128=123;
让big_a:BigUint=a.进入();
让big_b:BigUint=b.进入();
让big_c:BigUint=c.进入();
让答案=大a*大b/大c;
println!(“答案:{}”,答案);
//答复:1883563148178650094572699
}
您是否尝试过(a/c)*b?或者,例如,将a
和b
除以c
c,然后乘以c
,计算最小误差,然后进行实数除法:将误差最小的数字除以另一个。或者实现f128(如果f64不够精确)。不幸的是,这是整数的工作方式。一般情况下,中间结果需要较大的类型。在某些情况下,更聪明的公式可能会有所帮助。你对a和b的相对大小有什么限制吗?如果它们是相似的,像(a/sqrt(c))*(b/sqrt(c))这样的东西似乎是合理的。我很惊讶没有人提出整数除法<代码>(a*b)/c不等同于整数除法下的(a/c)*b
(尝试使用(a,b,c)=(1,2,2)
)。对方程的任何重组都会产生不同的结果,这一点我并不感到惊讶。在这个主题上有相当多的重复项,例如,应该推广到128位。