标签: arbitrary-precision

计算e到2万亿位数的最快方法是什么?

我想计算e到2万亿(2,000,000,000,000)个数字.这约为1.8 TiB的纯e.我刚刚使用GMP实现了一个泰勒系列扩展算法(代码可以在这里找到).

不幸的是,当我在计算机上总计超过4000个术语时,它会崩溃,可能是因为内存不足.

计算e的当前技术水平是什么?哪种算法最快?任何值得关注的开源实现?请不要提及y-cruncher,这是封闭的来源.

c performance arbitrary-precision

30
推荐指数
2
解决办法
3105
查看次数

什么类用于代表货币?

我应该使用什么类来表示金钱以避免大多数舍入错误?

我应该使用Decimal还是简单的内置number

Money我可以使用现有的支持货币转换的类吗?

我应该避免哪些陷阱?

python precision currency rounding-error arbitrary-precision

25
推荐指数
6
解决办法
2万
查看次数

什么编程语言支持任意精度算术?

哪些编程语言支持任意精度算术,你能举一个简单的例子来说明如何打印任意数量的数字吗?

programming-languages bigdecimal arbitrary-precision

20
推荐指数
7
解决办法
9967
查看次数

长整数例程可以从SSE中受益吗?

我还在研究C++中任意长整数的例程.到目前为止,我已经为64位Intel CPU实现了加/减和乘法.

一切正常,但我想知道我是否可以通过使用SSE来加快速度.我浏览了SSE文档和处理器指令列表,但我找不到任何我认为可以使用的内容,原因如下:

  • SSE有一些整数指令,但大多数指令处理浮点.看起来它不是设计用于整数(例如,是否有较小的整数比较?)

  • SSE的想法是SIMD(相同的指令,多个数据),因此它提供了2或4个独立操作的指令.另一方面,我希望有一个像128位整数加(128位输入和输出)的东西.这似乎不存在.(但是?在AVX2中可能?)

  • 整数加法和减法既不处理输入也不处理输出.因此,手动操作非常麻烦(因而也很慢).

我的问题是:我的评估是正确的还是有什么我忽略的?长整数例程可以从SSE中受益吗?特别是,它们可以帮助我编写更快的添加,子或mul例程吗?

performance integer sse bignum arbitrary-precision

19
推荐指数
1
解决办法
3773
查看次数

如何增加太字节大小的数字?

当乘以非常大的数字时,可以使用基于FFT的乘法(参见Schönhage-Strassen算法).出于性能原因,我正在缓解旋转因素.问题是对于大量(技嘉大小)我需要大小为2 ^ 30或更多的FFT表,这占用了太多的RAM(16 GB及以上).所以我似乎应该使用另一种算法.

有一个名为y-cruncher的软件,用于计算Pi和其他常数,它们可以乘以太字节大小的数字.它使用称为混合NTT的算法和另一种称为VST的算法(参见VST乘法算法部分中A峰到y-cruncher v0.6.1).

任何人都可以对这些算法或任何其他可用于乘以TB级数字的算法有所了解吗?

c performance arbitrary-precision

19
推荐指数
1
解决办法
899
查看次数

numpy任意精度线性代数

我有一个numpy 2d阵列[中/大型 - 比如500x500].我想找到它的元素指数的特征值.问题是某些值非常负(-800,-1000等),并且它们的指数下溢(意味着它们非常接近零,因此numpy将它们视为零).无论如何在numpy中使用任意精度?

我梦想的方式:

import numpy as np

np.set_precision('arbitrary') # <--- Missing part
a = np.array([[-800.21,-600.00],[-600.00,-1000.48]])
ex = np.exp(a)  ## Currently warns about underflow
eigvals, eigvecs = np.linalg.eig(ex)
Run Code Online (Sandbox Code Playgroud)

我已经搜索了一个gmpy和mpmath的解决方案无济于事.任何想法都会受到欢迎.

python math numpy linear-algebra arbitrary-precision

16
推荐指数
3
解决办法
1万
查看次数

AVX VMOVDQA比两个SSE MOVDQA慢?

当我正在进行快速ADD循环(加速x64汇编器ADD循环)时,我正在使用SSE和AVX指令测试内存访问.要添加,我必须读取两个输入并产生一个输出.所以我编写了一个虚拟例程,它将两个x64值读入寄存器,然后将其写回存储器而不进行任何操作.这当然没用,我只做了基准测试.

我使用一个展开的循环,每个循环处理64个字节.它由8个块组成,如下所示:

mov rax, QWORD PTR [rdx+r11*8-64]
mov r10, QWORD PTR [r8+r11*8-64]
mov QWORD PTR [rcx+r11*8-64], rax
Run Code Online (Sandbox Code Playgroud)

然后我将其升级到SSE2.现在我使用4个这样的块:

movdqa xmm0, XMMWORD PTR [rdx+r11*8-64]
movdqa xmm1, XMMWORD PTR [r8+r11*8-64]
movdqa XMMWORD PTR [rcx+r11*8-64], xmm0
Run Code Online (Sandbox Code Playgroud)

后来我使用了AVX(每个寄存器256位).我有2个这样的块:

vmovdqa ymm0, YMMWORD PTR [rdx+r11*8-64]
vmovdqa ymm1, YMMWORD PTR [r8+r11*8-64]
vmovdqa YMMWORD PTR [rcx+r11*8-64], ymm0
Run Code Online (Sandbox Code Playgroud)

到目前为止,还不那么引人注目.有趣的是基准测试的结果:当我在1K + 1K = 1K 64位字(即两次输入的8 kb和一次输出的8KB)运行三种不同的方法,我得到了奇怪的结果.以下每个时序用于处理两次64字节输入到64字节输出.

  • x64寄存器方法以大约15个周期/ 64个字节运行
  • SSE2方法以大约8.5个周期/ 64个字节运行
  • AVX方法以大约9个周期/ 64个字节运行

我的问题是:为什么AVX方法比SSE2方法慢(虽然不是很多)?我预计它至少会与之相提并论.使用YMM寄存器会花费多少额外的时间吗?内存已对齐(否则会获得GPF).

有没有人对此有解释?

assembly sse bignum avx arbitrary-precision

15
推荐指数
1
解决办法
5320
查看次数

Python和"任意精度整数"

根据Python整数范围的答案,Python应该具有"任意精度整数" .但是这个结果显然不是任意精度:

$ python -c 'print("%d" % (999999999999999999999999/3))'
333333333333333327740928
Run Code Online (Sandbox Code Playgroud)

根据PEP 237,bignum任意大(不仅仅是C long型的大小).和维基百科说,Python的bignum是任意精度.

那么为什么上面一行代码的结果不正确呢?

python arbitrary-precision

15
推荐指数
1
解决办法
9012
查看次数

Pascal(Delphi)中的大数字

我可以使用Delphi中的内置方法处理大量数据(超过10 ^ 400)吗?

delphi pascal bignum arbitrary-precision

14
推荐指数
1
解决办法
4202
查看次数

如何处理不适合任何语言数据结构的大整数

我正在尝试解决编程竞赛的初步问题以及我必须计算的两个问题,并打印一些非常大的整数(如100!,2 ^ 100).

我还需要一种快速计算这个大整数的能力的方法.

你可以为我建议一些算法或数据结构吗?(顺便说一下,我读过C接口和实现的'任意精度算术'部分,但它对pow()没有帮助)

编辑:我认为通过平方法和位移的取幂对功率起作用,但我还需要一种快速的方法来计算这个因子的阶乘.谢谢.

EDIT2:对于那些感兴趣的人;

找到包含长度为N的所有位串的最短位串长度(对不起我的英文,我举一个例子).N <= 10000

例如,包括长度为2(00,01,10,11)的所有比特串的最短比特串长度是5(11001).

我对这个问题的解决方案是2 ^ n + n - 1.(所以我应该计算2的幂,我想我会使用位移)

其他问题是,给定2个长度,找到你可以通过多少种方式达到长度N.例如,输入是10,2,3.那么你应该用2和3达到10(例如,2 + 3) 2 + 2 + 2 + 2,2 + 2 + 3 + 3,3 + 2 + 2 + 3,3 + 3 + 2 + 2 ......).1 <= N <2 ^ 63.我们将在mod 1000000007中计算anwser.

我的解决方案是,2x + 3y = N,所以x =(N - 3y)/ 2.对于从0到2*N/3的y,如果x是一个整数,那么我应该计算这个X和Y的广义置换,总计+ =(x + y)!/(x!*y!).

c algorithm biginteger arbitrary-precision data-structures

14
推荐指数
2
解决办法
2775
查看次数