在C ++中,有没有用于任意精度算术的编译时库(模板元编程)?
我需要这样做来帮助AVR微控制器程序中的定点算术和二进制缩放。例如,当两个数字分别乘以各自的边界时,bignum将用于计算结果的边界,并在输入和/或输出中适当地移动分数点。但是结果的界限可能无法用标准整数类型表示。
可能是Boost.Multiprecision是您想要的。
由于在编译时不允许动态分配,因此您只能在运行时使用任意长的类型。这就是为什么像std::string
或std::vector
这样的标准类型没有任何constexpr构造函数的原因。任意精度数学也是如此。解决方法是将变量声明为static
,以便在启动时仅计算一次
但是,如果您知道值的范围,则可以使用ctbignum,它是用于多精度编译时和运行时算术(包括模块化算术)的库
Constexpr C++17 Big-Integer / Finite-Field library
这是用于固定宽度的“小大整数”计算的仅标头模板库,可在运行时和编译时使用。 “小大整数”是指通常在密码学应用程序中出现的具有几个分支的数字(换句话说,几百个比特)。
Boost.MPL可能是已知限制的另一个选择
在C ++ 20 some kind of dynamic allocation in constexpr functions is allowed中,因此可能会有一个真正的编译时bignum库
但是我不认为任意精度是解决定点算术的解决方案。这完全违背了目标,您可以从一开始就简单地使用浮点数。因此,这很可能是XY problem,您应该询问如何进行这些定点运算]