标签: mpfr

我需要非常快地计算斯特林近似

我正在编写一个用于统计采样的小型库,它需要尽可能快地运行。在分析中,我发现函数中大约 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)

我有几个不同的想法:

  • 预先计算函数前 8 个以上的输入。
  • 优化数学(使用较粗略的近似值以获得较小的精度)
  • 使用多个线程并行计算不同的输入
  • 当数字适合机器数据类型时切换到本机算术

我还可以采取其他方法吗?

c c++ numerical mpfr arbitrary-precision

5
推荐指数
1
解决办法
870
查看次数

cmake 未找到 GMP 和 MPFR,但已安装

我正在尝试在 mac os X 10.11 上编译需要 boost、GMP 和 MPFR 的 plll 库。

我已经通过自制软件安装了 boost、GMP 和 MPFR,然后我在 plll 中的目录构建中启动了 cmake,但是我得到了那个错误:

 By not providing "FindMPFR.cmake" in CMAKE_MODULE_PATH this project has
 asked CMake to find a package configuration file provided by "MPFR", but
 CMake did not find one.

 Could not find a package configuration file provided by "MPFR" with any of
the following names:

MPFRConfig.cmake
mpfr-config.cmake

Add the installation prefix of "MPFR" to CMAKE_PREFIX_PATH or set
"MPFR_DIR" to a directory containing one of …
Run Code Online (Sandbox Code Playgroud)

macos boost cmake mpfr gmp

5
推荐指数
0
解决办法
2852
查看次数

python“bigfloat”包安装问题

我试图在我的 Mac (OS X 10.8.4) 上安装“bigfloat”包,但遇到了一些问题。包“bigfloat”需要另外两个依赖项:1) mpfr 和 2) gmp。

我在这里安装了 gmp: http: //gmplib.org/ <-- 这似乎工作正常。

但安装 mpfr 并不那么容易(http://www.mpfr.org/mpfr-current/mpfr.html#Installing-MPFR)。他们说只需 ./configure、make 和 make install 即可使其运行,但我收到此错误:

checking for gmp.h... no
configure: error: gmp.h can't be found, or is unusable.
Run Code Online (Sandbox Code Playgroud)

我用谷歌搜索了一下,人们建议在配置命令中指定路径,但到目前为止我还没有运气。任何帮助,将不胜感激!

作为参考,我正在查看 mpfr-3.1.2 (位于目录:/Users/myusername)和 gmp-5.1.2 (位于同一目录)。

谢谢!

python mpfr gmp bigfloat

4
推荐指数
1
解决办法
2065
查看次数

用Emscripten编译GMP / MPFR

好吧,这让我发疯了。我已经尝试了至少一个月,但互联网上没有任何帮助。

我跟着步骤。当我执行这些步骤时,即使该示例也不起作用,因为当我执行此步骤时,我会明白这一点。

bitcode ==> javascript
warning: unresolved symbol: __gmpz_cmp
warning: unresolved symbol: __gmpz_mul_ui
warning: unresolved symbol: __gmpz_submul_ui
warning: unresolved symbol: __gmpz_init_set_ui
warning: unresolved symbol: __gmpz_mul_2exp
warning: unresolved symbol: __gmpz_init
warning: unresolved symbol: __gmpz_fdiv_qr
warning: unresolved symbol: __gmpz_add
Run Code Online (Sandbox Code Playgroud)

当我运行生成的complete.js文件时-

missing function: __gmpz_init
-1
-1

/home/ubuntu/workspace/gmp.js/complete.js:117
      throw ex;
      ^
abort(-1) at Error
    at jsStackTrace (/home/ubuntu/workspace/gmp.js/complete.js:1045:13)
    at stackTrace (/home/ubuntu/workspace/gmp.js/complete.js:1062:22)
    at abort (/home/ubuntu/workspace/gmp.js/complete.js:6743:44)
    at ___gmpz_init (/home/ubuntu/workspace/gmp.js/complete.js:1744:56)
    at Object._main (/home/ubuntu/workspace/gmp.js/complete.js:4978:2)
    at Object.callMain (/home/ubuntu/workspace/gmp.js/complete.js:6627:30)
    at doRun (/home/ubuntu/workspace/gmp.js/complete.js:6681:60)
    at run (/home/ubuntu/workspace/gmp.js/complete.js:6695:5)
    at Object.<anonymous> (/home/ubuntu/workspace/gmp.js/complete.js:6769:1)
    at …
Run Code Online (Sandbox Code Playgroud)

javascript mpfr gmp emscripten asm.js

4
推荐指数
2
解决办法
849
查看次数

如何在 Ubuntu 18.04 上安装 Rmpfr?

install.packages("Rmpfr")我收到此错误后

configure: error: Header file mpfr.h not found; maybe use
--with-mpfr-include=INCLUDE_PATH
ERROR: configuration failed for package ‘Rmpfr’
Run Code Online (Sandbox Code Playgroud)

我在没有--with-mpfr-include=INCLUDE_PATH成功的情况下将建议输入到终端中。

linux r mpfr

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

如何使用mpfr和mpreal的printf

使用printf及其表兄弟sprintffprintf显示mpreal-type变量值的正确语法是什么?我试过天真的铸造加倍:

printf ("... %g ...", (double) var);
Run Code Online (Sandbox Code Playgroud)

仅从g ++接收此错误消息:

error: invalid cast from type ‘mpfr::mpreal’ to type ‘double’
Run Code Online (Sandbox Code Playgroud)

double在程序的其他地方使用-type变量没有问题.

我听说该类型mpreal是该库的一部分,旨在使用通常的二元运算符来执行任意精度算术运算.

c++ double printf casting mpfr

2
推荐指数
1
解决办法
2720
查看次数

在Ubuntu 18.04上更新后无法打开libmpfr.so.4

今天,我将笔记本电脑更新为Ubuntu 18.04。现在,我尝试为我的学士论文运行一个程序,但是它给了我以下错误消息:

加载共享库时出错:libmpfr.so.4:无法打开共享库文件:没有这样的文件或目录

我做了一些研究,我认为libmpfr4已在此ubuntu版本中删除。有什么办法可以解决这个问题?

linux ubuntu mpfr ubuntu-18.04

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

使用 MPFR 时如何在 Boost Multi precision 中设置舍入模式

我试图弄清楚如何使用 Boost Multi precision 中的舍入模式来格式化 mpfr_float 数字。在下面的示例中,我希望 1.55 舍入为 1.5 或 1.6,具体取决于使用的舍入模式,但对于所有情况,它都会输出 1.5。如何使用 MPFR 在 Boost 中实现这个简单的功能?

#include <iostream>
#include <boost/multiprecision/mpfr.hpp>

void setRoundingMode(boost::multiprecision::mpfr_float m, mpfr_rnd_t r)
{
    mpfr_t tmp;
    mpfr_init(tmp);
    mpfr_set(tmp, m.backend().data(), r);
    mpfr_clear(tmp);
}

int main()
{
    using namespace boost::multiprecision;
    using std::cout;
    using std::endl;
    using std::setprecision;

    mpfr_float::default_precision(50);
    mpfr_float a("1.55");

    setRoundingMode(a, MPFR_RNDN); /* round to nearest, with ties to even */
    cout << setprecision(2) << a << endl;

    setRoundingMode(a, MPFR_RNDZ); /* round toward zero */
    cout << setprecision(2) << a …
Run Code Online (Sandbox Code Playgroud)

c++ boost mpfr gmp boost-multiprecision

2
推荐指数
1
解决办法
520
查看次数

GMPY2 不安装

编辑:我正在使用应用商店中的 Win 10 和 Ubuntu

我尝试使用以下方法安装 gmpy2:

apt-get install libgmp-dev
apt-get install libmpfr-dev
apt-get install libmpc-dev
Run Code Online (Sandbox Code Playgroud)

并且还下载了 MPIR 并编译了它。但是使用pip install gmpy2仍然给我错误

c:\users\gypsyzz\appdata\local\temp\pip-install-l2hlf7q4\gmpy2\src\gmpy.h(104): fatal error C1083: Cannot open include file: 'mpir.h': No such file or directory
error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\BuildTools\\VC\\Tools\\MSVC\\14.13.26128\\bin\\HostX86\\x64\\cl.exe' failed with exit status 2
Run Code Online (Sandbox Code Playgroud)

此外,我发现使用https://www.lfd.uci.edu/~gohlke/pythonlibs/上的预建轮子并没有给我任何功能。

import gmpy2
from gmpy2 import mpz,mpq,mpfr,mpc
gmpy2.conjugate(mpc())
Traceback (most recent call last):

File "<ipython-input-18-2d51a42bda9a>", line 1, in <module>
gmpy2.conjugate(mpc())

AttributeError: module 'gmpy2' has no attribute 'conjugate'
Run Code Online (Sandbox Code Playgroud)

我更确定我对最后一部分的函数理解有误,所以请告诉我正确的语法。

mpfr gmp mpc mpir

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

与matlab相比,获得三角函数的正确值

我试图用它的c ++代码测试一个simulink块,simulink块包含一些algebratic,三角函数和积分器.在我的测试过程中,从simulink块输入使用随机数生成器,输入和输出都被记录到mat文件中(使用MatIO),将由C++代码读取,输出与C++计算得到.对于仅包含代数函数的信号,结果是精确的,差值为零,对于包含三角函数的路径,差值约为10e-16.matlab社区声称他们是正确的而glibc不是.

最近我发现在glibc中实现的三角函数的输出值不等于matlabs中产生的值,根据旧问题1 2 3和我的实验,这些差异与1 glp> glibc的准确性有关.对于大多数块而言,这个10e-16误差感觉不大,但是在积分器的输出中,10e-16积累的越来越多,积分器的最终误差将是大约1e-3,这有点高,这种阻止是不可接受的.

经过对该问题的大量研究后,我决定使用其他方法来计算sin/cos函数,而不是glibc中提供的函数.

我实施了这些apporaches,

1-泰勒系列具有长双变量和-O2(强制使用x87 FPU及其80位浮点运算)

2-taylor系列与GNU quadmath库(128位精度)

3个MPFR库(128位)

4- CRLibm(正确舍入的libm)

5- Sun的LibMCR(就像CRLibm一样)

6- X86 FSIN/FCOS具有不同的舍入模式

7- Java.lang.math到JNI(我认为matlab使用)

8-fdlibm(根据我见过的一篇博文)

9- openlibm

10-通过mex/matlab引擎调用matlab函数

除了最后一个以外的实验不能生成等于matlab的值.我测试了所有这些库和方法的广泛输入,其中一些像libmcr和fdlibm将为一些输入产生NAN值(看起来他们没有良好的范围检查),其余的产生值错误10e-16及更高.与matlab相比,只有最后一个产生正确的值,但是调用matlab函数并不比本机实现快得多且慢得多.

另外我还说为什么MPFR和泰勒系列长双重和四重奏都出错了.

这是具有长双变量(80位精度)的泰勒系列,并且应该用-O2编译,这可以防止将FPU堆栈中的值存储到寄存器中(80位到64位=精度损失),在进行任何计算之前,还将设置x87的舍入模式到最近的

typedef long double dt_double;

inline void setFPUModes(){
    unsigned int mode = 0b0000111111111111;
    asm(

    "fldcw %0;"
    :  : "m"(mode));
}
inline dt_double factorial(int x)  //calculates the factorial
{
    dt_double fact = 1;   
    for (; x >= 1 ; x--)
        fact = x * fact;
    return fact;
}

inline dt_double …
Run Code Online (Sandbox Code Playgroud)

c++ floating-point matlab mpfr ieee-754

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