我应该使用什么类来表示金钱以避免大多数舍入错误?
我应该使用Decimal
还是简单的内置number
?
Money
我可以使用现有的支持货币转换的类吗?
我应该避免哪些陷阱?
python precision currency rounding-error arbitrary-precision
哪些编程语言支持任意精度算术,你能举一个简单的例子来说明如何打印任意数量的数字吗?
我还在研究C++中任意长整数的例程.到目前为止,我已经为64位Intel CPU实现了加/减和乘法.
一切正常,但我想知道我是否可以通过使用SSE来加快速度.我浏览了SSE文档和处理器指令列表,但我找不到任何我认为可以使用的内容,原因如下:
SSE有一些整数指令,但大多数指令处理浮点.看起来它不是设计用于整数(例如,是否有较小的整数比较?)
SSE的想法是SIMD(相同的指令,多个数据),因此它提供了2或4个独立操作的指令.另一方面,我希望有一个像128位整数加(128位输入和输出)的东西.这似乎不存在.(但是?在AVX2中可能?)
整数加法和减法既不处理输入也不处理输出.因此,手动操作非常麻烦(因而也很慢).
我的问题是:我的评估是正确的还是有什么我忽略的?长整数例程可以从SSE中受益吗?特别是,它们可以帮助我编写更快的添加,子或mul例程吗?
当乘以非常大的数字时,可以使用基于FFT的乘法(参见Schönhage-Strassen算法).出于性能原因,我正在缓解旋转因素.问题是对于大量(技嘉大小)我需要大小为2 ^ 30或更多的FFT表,这占用了太多的RAM(16 GB及以上).所以我似乎应该使用另一种算法.
有一个名为y-cruncher的软件,用于计算Pi和其他常数,它们可以乘以太字节大小的数字.它使用称为混合NTT的算法和另一种称为VST的算法(参见VST乘法算法部分中的A峰到y-cruncher v0.6.1).
任何人都可以对这些算法或任何其他可用于乘以TB级数字的算法有所了解吗?
我有一个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的解决方案无济于事.任何想法都会受到欢迎.
当我正在进行快速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字节输出.
我的问题是:为什么AVX方法比SSE2方法慢(虽然不是很多)?我预计它至少会与之相提并论.使用YMM寄存器会花费多少额外的时间吗?内存已对齐(否则会获得GPF).
有没有人对此有解释?
根据Python整数范围的答案,Python应该具有"任意精度整数" .但是这个结果显然不是任意精度:
$ python -c 'print("%d" % (999999999999999999999999/3))'
333333333333333327740928
Run Code Online (Sandbox Code Playgroud)
根据PEP 237,bignum
任意大(不仅仅是C long
型的大小).和维基百科说,Python的bignum
是任意精度.
那么为什么上面一行代码的结果不正确呢?
我可以使用Delphi中的内置方法处理大量数据(超过10 ^ 400)吗?
我正在尝试解决编程竞赛的初步问题以及我必须计算的两个问题,并打印一些非常大的整数(如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!).