我正在研究一个项目(在Scala中),我需要操作一些非常大的数字; 太大而不能用积分类型来表示.Java提供了BigInteger和BigDecimal类(scala提供了一个很好的瘦包装器).但是,我注意到这些库比我过去使用的其他任意精度库(即http://www.ginac.de/CLN/)慢得多,并且速度差异似乎大于可归因的值仅靠语言.
我对我的程序进行了一些分析,并且44%的执行时间用于BigInteger乘法方法.我想加快我的程序,所以我正在寻找比BigInteger类(及其Scala包装器)更快更有效的选项.我看过LargeInteger(来自JScience)和Aint(来自Afloat).但是,两者似乎都比标准的BigInteger类执行得慢.
有没有人知道Java(或在JVM上可用)任意精度数学库,重点是高性能整数乘法和加法?
由于实现AP分数的方法有两种,一种是模拟double
数据类型的存储和行为,只有更多的字节,另一种是使用现有的整数APA实现来表示分数作为理性,即作为一对整数,分子和分母,这两种方式中的哪一种更有可能在性能方面提供有效的算术?(内存使用率确实很小.)
我知道现有的C/C++库,其中一些提供带有"浮点数"的小数APA和其他有理性的(不过它们都没有定点APA,但是当然我可以对依赖于"的库进行基准测试"浮动"对使用合理实现的实现进行实现,但结果很大程度上取决于我必须从近十个可用库中随机选择的那些特定库的实现细节.因此,我感兴趣的两种方法的理论优缺点(或者如果考虑定点APA则为三种).
我在 Go 代码中使用shopspring/decimal而不是 float64 来防止数学错误。在编写我的 protobuf 文件以通过 gRPC 传输这些值时,我可以使用:
double
转换为 float64string
这肯定会以自己的方式精确,但让我觉得笨拙传统智慧教会我在货币应用程序中避开浮动,但我可能过于小心,因为它是序列化的一个点。
我需要可用于C++的最快的库.我的平台将是x86和x86-64,它支持浮点.
任意精度有符号整数几乎总是使用符号数值表示来实现:
对符号数值的明显偏好与固定宽度有符号整数类型中对二进制补码的近乎普遍的偏好形成鲜明对比。问题是,为什么符号数值对于 BigIntegers 来说如此明显是首选?(如果您不同意前提,我欢迎反例。)
请注意,BigInteger API 通常为重要的位运算指定“如同二进制补码”语义(例如Java、Python )。这提供了与这些操作的通常含义的一致性。这并不规定实际的内部表示(仅是实现细节),但如果其他条件相同,它应该是支持在内部使用二进制补码的一点。
浮点数使用符号数值,与使用二进制补码的整数不同。不过,浮点并不是真正的指导先例,因为浮点运算的行为和算法与整数运算有很大不同。Bignum 更像整数而不是浮点数。
我们知道“教科书”上为什么补码在数学上起作用以及为什么它有优点的原因。在我看来,这些原因同样适用于整数和大整数。这在多大程度上是真的?
当然,硬件固定精度整数和软件任意精度整数的设计约束之间存在巨大差异。从这个意义上说,看到设计师在这些不同的领域做出不同的权衡一点也不奇怪。那么,应用于任意精度整数时,符号-数值和补码之间的权衡是什么?例如,这可能涉及某些重要算法的性能或简单性。
我希望您的回答能够阐明 BigInteger 算术的设计注意事项,并帮助我从新的角度重新审视我对补码的了解。
(需要明确的是:当我说任意精度整数的二进制补码时,我的意思是使用单词数组的表示,其位模式放在一起时是所需数字的二进制补码表示 - 也许还有额外的要求没有“不必要的前导 0”(对于非负数)或“不必要的前导 1”(对于负数)。)
Oauth需要一个随机的64位无符号数,编码为十进制格式的ASCII字符串.你们能用PHP帮助我实现这个目标吗?谢谢
我正在使用API mpmath来计算以下总和
让我们考虑一下由下式定义的系列u0,u1,u2:
u0 = 3/2 = 1,5
u1 = 5/3 = 1,6666666…
un+1 = 2003 - 6002/un + 4000/un un-1
Run Code Online (Sandbox Code Playgroud)
系列在2上收敛,但由于四舍五入问题,它似乎在2000年汇合.
n Calculated value Rounded off exact value 2 1,800001 1,800000000 3 1,890000 1,888888889 4 3,116924 1,941176471 5 756,3870306 1,969696970 6 1996,761549 1,984615385 7 1999,996781 1,992248062 8 1999,999997 1,996108949 9 2000,000000 1,998050682 10 2000,000000 1,999024390
我的代码:
from mpmath import *
mp.dps = 50
u0=mpf(3/2.0)
u1=mpf(5/3.0)
u=[]
u.append(u0)
u.append(u1)
for i in range (2,11):
un1=(2003-6002/u[i-1]+(mpf(4000)/mpf((u[i-1]*u[i-2]))))
u.append(un1)
print u
Run Code Online (Sandbox Code Playgroud)
我的结果不好:
[mpf('1.5'), …
Run Code Online (Sandbox Code Playgroud) 使用任意精度算术(例如512位整数)时,有没有办法让GCC在不使用内联汇编的情况下使用ADC和类似指令?
乍一看GMP的源代码显示,它们只是为每个支持的平台提供了汇编实现.
这是我编写的测试代码,它从命令行添加两个128位数字并打印结果.(受mini-gmp的add_n启发):
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
int main (int argc, char **argv)
{
uint32_t a[4];
uint32_t b[4];
uint32_t c[4];
uint32_t carry = 0;
for (int i = 0; i < 4; ++i)
{
a[i] = strtoul (argv[i+1], NULL, 16);
b[i] = strtoul (argv[i+5], NULL, 16);
}
for (int i = 0; i < 4; ++i)
{
uint32_t aa = a[i];
uint32_t bb = b[i];
uint32_t r = aa + carry;
carry = (r < carry);
r += …
Run Code Online (Sandbox Code Playgroud) c optimization gcc compiler-optimization arbitrary-precision
我正在使用Zarith库来进行任意精度的有理算术.假设我有一个有理数q
的类型Q.t
,即两个大整数的比率(Q
是Zarith的任意精度有理数模块).有时,为了便于阅读,我想将此数字打印为浮点数,有时我需要将此数字浮点数转换为以后的非任意精度计算.有没有办法将q
浮点数转换为一定的精度?
我转换q
为浮点的方式现在无法保证,并且可以创建未定义的浮点数(Z
是任意精度整数模块):
let to_float q =
let n, d = num q, den q in
(* check if d is zero and raise an error if it is *)
let nf, df = Z.to_float n, Z.to_float d in
nf /. df
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来处理这个问题,我可以获得最准确接近任何浮点数的浮点数q
?
编辑
如果有人有兴趣,我很快就会在OCaml中写下Mark Dickinson的回答.它可能(绝对)可以改进和清理.如果我这样做,或者如果有人有任何改进建议,我会编辑.但是现在这已经解决了我的问题!
let to_float q =
let n, d = num q, den q in
let n_sign = Z.sign n in …
Run Code Online (Sandbox Code Playgroud) c ×3
c++ ×3
biginteger ×2
math ×2
bignum ×1
binary ×1
fixed-point ×1
gcc ×1
go ×1
java ×1
numeric ×1
oauth ×1
ocaml ×1
optimization ×1
performance ×1
php ×1
precision ×1
python ×1
random ×1
scala ×1