我正在实现一个必须支持对整数进行任意精度操作的BigInt类.
引自S.Skiena的"算法设计手册":
我应该做什么基础 [编者注:任意精度] 算术? - 以十进制形式实现自己的高精度算术包可能是最简单的,因此将每个整数表示为一个基数为10的数字.但是,使用更高的基数更有效,理想情况下等于硬件算法完全支持的最大整数的平方根.
如何找到硬件算法完全支持的最大整数?如果我理解正确,作为我的机器是基于x64的PC,支持的最大整数应该是2 ^ 64(http://en.wikipedia.org/wiki/X86-64-架构特性:64位整数能力),所以我应该使用base 2 ^ 32,但是在c ++中有一种方法可以通过编程方式获得这个大小,所以我可以输入我的base_type吗?
出于教学目的,您将如何编写“julian”Julia 1.0+ 代码来打印pi小数点后的前 2,000 位数字?Julia REPL 中的结果应该与此pi 网站匹配。
预期输出是:
julia> include("solution.jl")
Pi to 2,000 digits to right of decimal point is:
3.
14159265358979323846264338327950288419716939937510
58209749445923078164062862089986280348253421170679
82148086513282306647093844609550582231725359408128
48111745028410270193852110555964462294895493038196
44288109756659334461284756482337867831652712019091
45648566923460348610454326648213393607260249141273
72458700660631558817488152092096282925409171536436
78925903600113305305488204665213841469519415116094
33057270365759591953092186117381932611793105118548
07446237996274956735188575272489122793818301194912
98336733624406566430860213949463952247371907021798
60943702770539217176293176752384674818467669405132
00056812714526356082778577134275778960917363717872
14684409012249534301465495853710507922796892589235
42019956112129021960864034418159813629774771309960
51870721134999999837297804995105973173281609631859
50244594553469083026425223082533446850352619311881
71010003137838752886587533208381420617177669147303
59825349042875546873115956286388235378759375195778
18577805321712268066130019278766111959092164201989
38095257201065485863278865936153381827968230301952
03530185296899577362259941389124972177528347913151
55748572424541506959508295331168617278558890750983
81754637464939319255060400927701671139009848824012
85836160356370766010471018194295559619894676783744
94482553797747268471040475346462080466842590694912
93313677028989152104752162056966024058038150193511
25338243003558764024749647326391419927260426992279
67823547816360093417216412199245863150302861829745
55706749838505494588586926995690927210797509302955
32116534498720275596023648066549911988183479775356
63698074265425278625518184175746728909777727938000
81647060016145249192173217214772350141441973568548
16136115735255213347574184946843852332390739414333
45477624168625189835694855620992192221842725502542
56887671790494601653466804988627232791786085784383
82796797668145410095388378636095068006422512520511
73929848960841284886269456042419652850222106611863
06744278622039194945047123713786960956364371917287
46776465757396241389086583264599581339047802759009
我有一个数百位长的浮点值(如 pi - 3 的前 100 位),需要一种对其进行操作的方法。有没有什么方法可以存储和操作具有大量小数的浮点数,并通过内置库保持很高的精度?c++中有没有类似python的Decimal模块的东西?
假设我有一个大整数的类型Integer.是否存在一个库功能(在前奏或其他地方),该给定的时Integer X将返回的平方根的整数部分X为Integer?
math haskell static-libraries square-root arbitrary-precision
这是一个数学问题,而不是编程是有用的!
我想计算非常大数的阶乘(10 ^ n,其中n> 6).我达到了任意精度,这对1000之类的任务非常有用.但它显然死了(StackOverflowException :))更高的值.我不是在寻找直接的答案,而是一些关于如何继续前进的线索.
    static BigInteger factorial(BigInteger i)
    {
        if (i < 1)
            return 1;
        else
            return i * factorial(i - 1);
    }
    static void Main(string[] args)
    {
        long z = (long)Math.Pow(10, 12);
        Console.WriteLine(factorial(z));
        Console.Read();
    }
我是否必须从System.Numerics.BigInteger辞职?我想到了一些在文件中存储必要数据的方法,因为RAM显然会耗尽.此时优化非常重要.那么你会推荐什么?
另外,我需要尽可能精确的值.忘记提到我不需要所有这些数字,只需要大约20个.
我正在处理一个运算无符号256位整数的算法,我需要编写一个函数来计算给定公式的值
uint256 compute(uint16 x) {
    return floor(exp2(x / 256)) - 1;
}
我们可以看到等式保留了变量边界(compute(0) == 0,compute(65535) == 1<<255).该划分应被视为有理数的划分,而不是整数.
提出的语法是伪C,但我正在寻找可以在其他语言中使用的通用算法方法.
非常感谢你的帮助和时间.
几年前,我帮助编写了一份处理金钱和保险的申请.最初,我们用浮点数代表货币(我知道这是一个很大的禁忌号).大多数应用程序只是添加和减去值,所以没有任何问题.但是,具体部分涉及货币价值的百分比,因此是乘法和除法.
我们立即开始遭遇浮点错误,不得不做一个重大的重构.我们使用了一个任意精度库来解决这个问题.然而,它并没有改变你最终只能获得一分钱的事实.你怎么回事呢?简短的回答是" 它很复杂".
现在我正准备开始研究类似的应用程序以取代旧的应用程序.多年来我一直在考虑这个问题.我一直认为最简单的方法是创建一个money数据类型,它包含一个整数(或BigInteger)来表示带有函数的便士数,以便将其打印成传统的,人性化的$0.00格式.
然而,研究这个,我找到了最近实现的Java Money API JSR 354.我惊讶地发现它支持它的代表性BigDecimal.因此,它包括用于舍入的特定逻辑.
在计算中携带一分钱的优势是什么?为什么我要这样做而不是说一分钱是"原子"形式的钱?
在Julia 1.0.0 REPL中,我得到以下结果:
# Line 1: This make sense.  I did not expect a Float64 to equal a BigFloat.
julia> 26.1 == big"26.1"
false
# Line 2: This surprised me when Line 1 is considered.  Again, like Line 1, I 
# did not expect a Float64 to equal an equivalent BigFloat.
julia> 26.0 == big"26.0"
true
# Line 3: This I expected based on Line 1 behavior.
julia> 26.1 - 0.1 == big"26.1" - 0.1
false
# Line 4: This …我正在尝试用 Haskell 编写一个程序,将 ' e'(欧拉数)返回到给定的小数位。到目前为止,这是我的代码:
factorial 0 = 1
factorial n = n * factorial (n - 1)
calculateE a 
    | a == 0 = 1 
    | otherwise = nextLevel
    where nextLevel = (1 / (factorial a)) + calculateE (a-1)
每当我打电话时,calculateE我只能返回小数点后 16 位。这是 Haskell/我的电脑的限制吗?有没有办法找回任意数量的小数位?
我有一个关于vpa可用于评估MatLab中符号表达式的命令的简短问题.
我的教科书说明如下:
"使用诸如sqrt数字之类的函数时需要小心,默认情况下会产生双精度浮点数.您需要将此类输入vpa作为符号字符串传递给正确的评估:vpa('sqrt(5)/pi')."
我不太明白这里的行话.为什么对于大多数输入我得到确切同样的答案我是否键入vpa(input)或vpa('input'),而不是平方根?例如,如果我输入vpa(sin(pi/4))或者vpa('sin(pi/4)'),我得到完全相同的答案,但如果我输入上面给出的问题vpa(sqrt(5)/pi),我得到的答案与我输入时的答案相同vpa('sqrt(5)/pi').  
如果有人能够比我上面的书更详细地解释这一点,我将非常感激!