我正在编写一个用于统计采样的小型库,它需要尽可能快地运行。在分析中,我发现函数中大约 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)
我有几个不同的想法:
我还可以采取其他方法吗?
我正在尝试在 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) 我试图在我的 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 (位于同一目录)。
谢谢!
好吧,这让我发疯了。我已经尝试了至少一个月,但互联网上没有任何帮助。
我跟着步骤此。当我执行这些步骤时,即使该示例也不起作用,因为当我执行此步骤时,我会明白这一点。
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) 在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成功的情况下将建议输入到终端中。
使用printf及其表兄弟sprintf和fprintf显示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是该库的一部分,旨在使用通常的二元运算符来执行任意精度算术运算.
今天,我将笔记本电脑更新为Ubuntu 18.04。现在,我尝试为我的学士论文运行一个程序,但是它给了我以下错误消息:
加载共享库时出错:libmpfr.so.4:无法打开共享库文件:没有这样的文件或目录
我做了一些研究,我认为libmpfr4已在此ubuntu版本中删除。有什么办法可以解决这个问题?
我试图弄清楚如何使用 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) 编辑:我正在使用应用商店中的 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)
我更确定我对最后一部分的函数理解有误,所以请告诉我正确的语法。
我试图用它的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)