我如何在Java中使用极大数字进行计算?
我已经尝试long但最大限度为9223372036854775807,并且当使用整数时,它不能保存足够的数字,因此不够准确,无法满足我的需要.
有没有办法解决?
我怎么去做算术,+ - /*%!,任意大整数而不使用java.math.BigInteger?
例如,factorial为90在Java中返回0.我希望能够解决这个问题.
对于在32位和64位程序(在Visual C++中)都能工作的64位整数,我能够进行乘法除法运算的最准确方法是什么?(如果溢出,我需要结果mod 2 64.)
(我正在寻找类似MulDiv64的东西,除了这个使用内联汇编,它只适用于32位程序.)
显然,可以投射到double后面,但是我想知道是否有更准确的方法并不太复杂.(即我不是在寻找任意精度的算术库!)
我的程序经常需要执行以下计算:
鉴于:
找:
显然我可以直接使用r=x*n/d,但经常会从中溢出x*n。如果我改为这样做,r=x*(n/d)则由于整数除法会除去小数部分,因此我只会得到0或x。然后有,r=x*(float(n)/d)但在这种情况下我不能使用浮点数。
精度会很高,但并不像速度和决定性功能那么关键(总是在给定相同输入的情况下返回相同的值)。
N和D当前已签名,但如果有帮助,我可以解决它们始终未签名的问题。
可以使用任何X值(以及N和D,只要N <= D)的泛型函数是理想的,因为此操作以各种不同的方式使用,但是我也有一个特殊的情况,其中X的值是已知的保持2的幂(准确地说是2048),并且加快特定的调用速度将是一个很大的帮助。
目前,我正在使用64位乘法和除法来完成此操作,以避免溢出(本质上是,int multByProperFraction(int x, int n, int d) { return (__int64)x * n / d; }但是有一些断言和多余的位数摆弄而不是舍入)。
不幸的是,我的探查器报告64位除法函数占用了过多的CPU(这是一个32位应用程序)。我尝试减少执行此计算的频率,但用尽了很多方法,因此,即使有可能,我也在尝试找出一种更快的方法。在X的常数为2048的特定情况下,我使用了移位而不是乘法,但这并没有太大帮助。
假设这uint是我的定点平台上最大的整数类型,我有:
uint func(uint a, uint b, uint c);
Run Code Online (Sandbox Code Playgroud)
这需要返回一个很好的近似值a * b / c。
的值c大于 的值a和 的值b。
所以我们肯定知道 的值a * b / c将适合 a uint。
但是,a * b本身的值会溢出 a 的大小uint。
因此,计算 的值的一种方法a * b / c是:
return a / c * b;
Run Code Online (Sandbox Code Playgroud)
甚至:
if (a > b)
return a / c * b;
return b / c * a;
Run Code Online (Sandbox Code Playgroud)
但是, 的值c …
我的问题仅限于 256 位无符号整数。
我有一个值x,我需要按比率对其进行除垢n / d,其中n < d。
简单的解决方案当然是x * n / d,但问题是x * n可能会溢出。
我正在寻找任何可能有助于获得尽可能准确的结果的算术技巧。
在计算之前将每个 和 除以n并d不能保证成功。gcd(n, d)x * n / d
我可以使用任何流程(迭代或其他)来解决这个问题吗?
请注意,我愿意选择不准确的解决方案,但我需要能够估计错误。
math ×4
integer ×3
biginteger ×2
c ×2
c++ ×2
java ×2
algorithm ×1
division ×1
numbers ×1
visual-c++ ×1