Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/math/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 在不使用较大容器的情况下乘以固定大小的分数_Math_Language Agnostic_Numerical Methods_Rust - Fatal编程技术网

Math 在不使用较大容器的情况下乘以固定大小的分数

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板条箱数量;

我得到了三个大小为128位的无符号数字:
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位。