C++ 使用Rcpp,如何计算两个大复数的比率
我用的是R,我有一个分数,它是一个复数:C++ 使用Rcpp,如何计算两个大复数的比率,c++,r,rcpp,complex-numbers,largenumber,C++,R,Rcpp,Complex Numbers,Largenumber,我用的是R,我有一个分数,它是一个复数: library(pracma); sigma.jj = 1; si = 2+3i; N = 2*exp( 0.5*(- (sigma.jj^2)*(si^2)) ); # 23.39454+6.80796i D = 1-pracma::erfz( (2^(-0.5))* ( si*sigma.jj )); # 2.225013-1.597002i N/D; # 5.489974+7.000163i 请注意,我正在呼叫erfz。。。复误差函数。这是
library(pracma);
sigma.jj = 1;
si = 2+3i;
N = 2*exp( 0.5*(- (sigma.jj^2)*(si^2)) ); # 23.39454+6.80796i
D = 1-pracma::erfz( (2^(-0.5))* ( si*sigma.jj )); # 2.225013-1.597002i
N/D; # 5.489974+7.000163i
请注意,我正在呼叫erfz
。。。复误差函数。这是该函数的pracma
库的源代码:
# Complex error function
erfz <- function(z)
{
if (is.null(z)) return( NULL )
else if (!is.numeric(z) && !is.complex(z))
stop("Argument 'z' must be a numeric or complex scalar or vector.")
a0 <- abs(z)
c0 <- exp(-z * z)
z1 <- ifelse (Re(z) < 0, -z, z)
i <- a0 <= 5.8
work.i <- i
cer <- rep(NA, length = length(z))
if ( sum(work.i) > 0) {
cs <- z1
cr <- cs
for (k in 1:120) {
cr[work.i] <- cr[work.i] * z1[work.i] * z1[work.i]/(k + 0.5)
cs[work.i] <- cs[work.i] + cr[work.i]
work.i <- work.i & (abs(cr/cs) >= 1e-15)
if (sum(work.i) == 0) break
}
cer[i] <- 2 * c0[i] * cs[i]/sqrt(pi)
}
work.i <- !i
if( sum(work.i) > 0) {
cl <- 1/z1
cr <- cl
for (k in 1:13) {
cr[work.i] <- -cr[work.i] * (k - 0.5)/(z1[work.i] * z1[work.i])
cl[work.i] <- cl[work.i] + cr[work.i]
work.i <- work.i & (abs(cr/cl) >= 1e-15)
if (sum(work.i) == 0) break
}
cer[!i] <- 1 - c0[!i] * cl[!i]/sqrt(pi)
}
cer[ Re(z) < 0] <- -cer[ Re(z) < 0]
return(cer)
}
在某一点上,R会断裂:
sigma.jj = 1;
si = 2+33i;
N = 2*exp( 0.5*(- (sigma.jj^2)*(si^2)) ); # -8.046987e+235+2.13732e+234i
D = 1-pracma::erfz( (2^(-0.5))* ( si*sigma.jj )); # -3.31367e+232+9.716936e+233i
N/D; # 5.01787+82.64292i
现在它崩溃了:
sigma.jj = 1;
si = 2+38i;
N = 2*exp( 0.5*(- (sigma.jj^2)*(si^2)) ); # Inf-Infi
D = 1-pracma::erfz( (2^(-0.5))* ( si*sigma.jj )); # NaN-Infi
N/D; # NaN+NaNi
<> >我相信我可以插入一些C++库来执行这个计算。由于复杂的误差函数,分子可能比分母容易
我以前在R中包含了独立的C++代码,使用这个链接作为指南:
比如:
// [[Rcpp::depends(RcppArmadillo, RcppEigen)]]
#include <RcppArmadillo.h>
#include <RcppEigen.h>
// [[Rcpp::export]]
SEXP armaMatMult(arma::mat A, arma::mat B){
arma::mat C = A * B;
return Rcpp::wrap(C);
}
// [[Rcpp::export]]
SEXP eigenMatTrans(Eigen::MatrixXd A){
Eigen::MatrixXd C = A.transpose();
return Rcpp::wrap(C);
}
// [[Rcpp::export]]
SEXP eigenMatMult(Eigen::MatrixXd A, Eigen::MatrixXd B){
Eigen::MatrixXd C = A * B;
return Rcpp::wrap(C);
}
// [[Rcpp::export]]
SEXP eigenMapMatMult(const Eigen::Map<Eigen::MatrixXd> A, Eigen::Map<Eigen::MatrixXd> B){
Eigen::MatrixXd C = A * B;
return Rcpp::wrap(C);
}
如何将分子中的大复数相乘(并取指数)?
如何在分母中乘以并应用复误差函数
也许每个都有一个函数
我熟悉gmp,但不希望实现整个库。我也不知道它是否能满足我的需要。您是否知道有R包,例如和?你可以看看它们,它们的相反方向取决于si=mpfr(2+3i,prebits=80);mpfr中的错误。默认值(2+(0+3i),预比特=80):无效的“x”。必须是数字(逻辑、原始)或字符当我尝试加载复数时,这是库(Rmpfr)<代码>si=mpfr(2,预比特=80)代码>[无复杂性]很好。抱歉,值得一试。下一步,也许通过包BH检查Boost?您是否知道有R包,例如和?你可以看看它们,它们的相反方向取决于si=mpfr(2+3i,prebits=80);mpfr中的错误。默认值(2+(0+3i),预比特=80):无效的“x”。必须是数字(逻辑、原始)或字符当我尝试加载复数时,这是库(Rmpfr)<代码>si=mpfr(2,预比特=80)代码>[无复杂性]很好。抱歉,值得一试。下一步,也许通过BH包检查增压?
// [[Rcpp::depends(RcppArmadillo, RcppEigen)]]
#include <RcppArmadillo.h>
#include <RcppEigen.h>
// [[Rcpp::export]]
SEXP armaMatMult(arma::mat A, arma::mat B){
arma::mat C = A * B;
return Rcpp::wrap(C);
}
// [[Rcpp::export]]
SEXP eigenMatTrans(Eigen::MatrixXd A){
Eigen::MatrixXd C = A.transpose();
return Rcpp::wrap(C);
}
// [[Rcpp::export]]
SEXP eigenMatMult(Eigen::MatrixXd A, Eigen::MatrixXd B){
Eigen::MatrixXd C = A * B;
return Rcpp::wrap(C);
}
// [[Rcpp::export]]
SEXP eigenMapMatMult(const Eigen::Map<Eigen::MatrixXd> A, Eigen::Map<Eigen::MatrixXd> B){
Eigen::MatrixXd C = A * B;
return Rcpp::wrap(C);
}
library(Rcpp)
sourceCpp("multiply.cpp")