我正在使用long double in
C程序来计算Mandelbrot Set的2D图像,但希望能够进一步精确地缩放.
是否可以从任意精度数学库中获得任何性能提升,可以根据需要限制精度,而不是从long double
精度直接跳到任意精度?
哪个是任意精度数学库中最快的?
我正在为 16 位嵌入式设备(80251 微控制器)开发应用程序,我需要任意精度算法。有谁知道适用于 8051 或 80251 的库?
GMP 没有明确支持 8051,我很担心在 16 位设备上可能会遇到的问题。
谢谢
C#是否支持任意精度算术(我认为这也称为bignums)?
如果没有,哪些库确实支持它?
我需要一个类似BSD的许可C(++)多精度库,支持复数,所以我尝试了boost.
以下代码失败:
#include <boost/multiprecision/cpp_dec_float.hpp>
#include <complex>
using namespace boost::multiprecision;
std::complex<cpp_dec_float_50>(1.0, 2.0) / std::complex<cpp_dec_float_50>(1.0, 2.0)
Run Code Online (Sandbox Code Playgroud)
在Visual Studio 2012中出现错误C2440,因为复杂的实现尝试在_Isinf或_Isnan等内部函数中强制转换为double.
这是我的错误吗?我怎样才能解决这个问题?有更好的图书馆吗?
c++ boost complex-numbers arbitrary-precision visual-studio-2012
此问题要求编程语言接受数字常量以分配给任意精度变量或用于任意精度表达式,而无需在表达式中赋值或应用之前执行转换为 IEEE 浮点表示。例如,以下伪语言赋值表达式:
BigNum x = 0.1;
Run Code Online (Sandbox Code Playgroud)
许多语言提供或可以访问库,这些库将允许BigNum
从文本字符串构建此类类型对象。我正在寻找可以将数字标记0.1
直接转换为 a 的编程语言,BigNum
而不需要程序员创建一个字符串,然后必须对其进行解析并可能在运行时抛出异常或标记错误。相反,我对编译器或标记器可以在将数字文字处理为任意精度的十进制或整数比率表示之前报告格式错误的数字或无效表达式的语法错误的语言感兴趣。
从Rosetta Code网站上的Literals/Floating point看来,J、Maple和Maxima为任意精度浮点数提供了文字语法。是否有其他更广泛使用的语言提供与我上面提供的伪示例相同或类似的东西?
作为一个具体的例子,Julia提供了对有理数的内置支持。这些数字具有可在源代码中使用的字面表示。例如:
x = 1//10
Run Code Online (Sandbox Code Playgroud)
现在1//10
和0.1
在数学上是相同的数字——以 10 为基数。但是,大多数编程语言会将源代码中的文字十进制数转换为 IEEE 浮点数。通常这正是我们想要的。然而,不少不熟悉数字的 IEEE 浮点表示(或已基本淡入历史的类似浮点表示)的人惊讶地发现,十分之一并不完全是十分之一。转换为二进制分数。此外,这种意外通常发生在“大部分时间”工作的代码在浮点“错误”累积而平均/抵消时产生令人惊讶的结果之后。当然,这是浮点表示和算术运算的本质,它们在实践中同样非常有用。每个计算机科学家都应该了解的关于浮点运算的知识
尽管如此,我发现有时整数不够用,浮点数会在其他精确计算中引入不必要的问题。为此,有理数和任意精度库符合要求。伟大的。但是,我仍然想知道是否有任何语言支持在语言本身中直接表示有理和任意精度文字。毕竟,我不想使用只有字符串文字的语言,然后必须在运行时将其解析为数字。
到目前为止,Julia 是有理数的一个很好的答案,但远不是唯一支持有理数文字的语言。但是,它没有任意精度文字。为此,J、Maple 和 Maxima 似乎拥有我正在寻找的东西。也许这几乎是完整的清单。尽管如此,如果有人知道另一或两个候选人,我将不胜感激...
到目前为止的答案...
迄今为止最好的答案是Haskell。它提供了对数字类型和运算以及数字文字符号的丰富理解,其中包括有理数表达式,并且似乎在所有情况下都将带有小数部分的十进制数视为有理数而不是浮点文字。至少,这是我从快速阅读 Haskell 文档和我遇到的一篇博客文章中收集到的,重载 Haskell 数字,第 3 部分,固定精度,其中作者指出:
...请注意,看起来像浮点数的文字实际上是有理数;原始 Haskell 设计中非常聪明的决定之一。
对于许多程序员来说,Julia 会更加平易近人,同时提供对各种数学类型和运算的出色支持以及通常出色的性能。然而,Python也有非常强大的语法,许多本机编译的包与当今 Julia 可用的包相匹配或超过,而且毫无疑问,在商业、开源和学术项目中享有更多的采用和应用——仍然,我的如果我有选择,个人偏好是朱莉娅。
就我自己而言,我将花更多时间研究 Haskell 并重新审视Ocaml …
floating-point programming-languages literals arbitrary-precision
我正在编写一个用于统计采样的小型库,它需要尽可能快地运行。在分析中,我发现函数中大约 40% 的时间花在计算阶乘对数的斯特林近似值上。我正在将优化工作集中在这一部分上。这是我的代码(使用MPFR):
const double AL[8] =
{ 0.0, 0.0, 0.6931471806, 1.791759469, 3.178053830, 4.787491743,
6.579251212, 8.525161361 };
void HGD::mpfr_afc(mpfr_t &ret, const mpfr_t &val){
if(mpfr_cmp_ui(val, 7) <= 0){
mpfr_set_d(ret, AL[mpfr_get_ui(val, MPFR_RNDN)], MPFR_RNDN);
}else{
mpfr_set(ret, val, MPFR_RNDN);
mpfr_add_d(ret, ret, 0.5, MPFR_RNDN);
mpfr_log(LV, val, MPFR_RNDN);
mpfr_mul(ret, LV, ret, MPFR_RNDN);
mpfr_sub(ret, ret, val, MPFR_RNDN);
mpfr_add_d(ret, ret, 0.399089934, MPFR_RNDN);
}
}
Run Code Online (Sandbox Code Playgroud)
我有几个不同的想法:
我还可以采取其他方法吗?
如何在 Fortran 中进行任意精度算术?
我需要两件事。我想处理非常大的整数和实数,并处理任意精确的实数。
我正在写一篇关于 pi 计算的学期论文。虽然我已经完成了理论站点,但我现在正在努力用 Python 实现 BBP 算法。
您可以在这里找到 BBP 算法: http://en.wikipedia.org/wiki/Bailey%E2%80%93Borwein%E2%80%93Plouffe_formula
这是我在 Python 中的实现:
from sympy.mpmath import *
pi = mpf(0)
mp.dps = 30;
for n in range(0,500):
pi = pi + mpf((1/16**n)*(4/(8*n+1)- 2/(8*n+4)- 1/(8*n+5)- 1/(8*n+6)) )
print(pi)
Run Code Online (Sandbox Code Playgroud)
我的问题是,无论我将 k 设置多高,或者将 pi 的小数位数设置多高,我都无法获得比 16 位数字更高的精度。
我使用mpmath来获得更高的精度,因为我之前遇到了一些问题。
我如何改进我的代码,以便获得更多数字?
我需要找到线性程序的精确实数解(其中所有输入都是整数)。重要的是,求解器还将解输出为有理数,理想情况下无需使用浮点数执行任何中间步骤。
GLPK 可以进行精确算术,但无法将解显示为有理数(即 1/3 得到 0.3333)。我可能可以尝试猜测这意味着哪个数字,但这似乎非常脆弱。
我无法找到可以做这种事情的 LP 求解器。有吗?性能并不是一个大问题;我的问题很小。(我确实考虑过使用像 Z3 这样的 SMT 求解器;它们可以解决此类问题并提供精确的有理解,但它们采用量词消除,而不是使用更适合线性规划(如 Simplex)的算法)
我有一个很大的 JSON 文件,其中包含 bigint 及其完整值——而不是像 JavaScript 默认情况下喜欢做的那样进行四舍五入。我们有一个解决方法来处理 Node.js 中的 bigint,但我正在尝试使用 jq(命令行工具)来清理我们的数据。然而,当我在 JSON 文件上运行 jq 时,它舍入了所有的 bigint。
有没有办法使用jq,这样它就不会舍入bigints,或者是否有另一个可以在Mac上运行的命令行工具供我使用?