Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用Rcpp,如何计算两个大复数的比率_C++_R_Rcpp_Complex Numbers_Largenumber - Fatal编程技术网

C++ 使用Rcpp,如何计算两个大复数的比率

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。。。复误差函数。这是

我用的是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
。。。复误差函数。这是该函数的
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")