在函数定义中使用 Eigen 库时,小数点未按预期存储
Decimal points are not stored as expected when Eigen library is used in function definition
我正在使用 Eigen 库编写一个 C++ 程序,当我执行我的代码时,我得到了我的变量 P 作为
`-4 -3 -2 -1 0 1 2 3 4 5`
但应该是-4.5 -3.5-2.5-1.5-0.5 1.5 2.5 3.5 4.5
这些数字正在四舍五入到最接近的整数 infinity.Please 帮助我找到问题的解决方案。
#include<iostream>
#include<math.h>
#include<stdlib.h>
#include<eigen3/Eigen/Dense>
#include<eigen3/Eigen/Core>
using namespace Eigen;
using namespace std;
using Eigen::MatrixXd;
using Eigen::MatrixXf;
MatrixXf create_linear_array(int &N1 , double &dx)
{
int i;MatrixXf num(10,1);
for(i=0;i<10;i++)
num(i,0)=(float)(((i+1)-(N1+1)/2));
return num;
}
int main()
{
//---------------------INITIALISATION & DECLARATION------------------------------
double dx=0.030;
int N1=10;
MatrixXf P;
P=create_linear_array(N1,dx);
cout<<P<<endl;
return 0;
}
你正在做整数除法,整数除法的结果总是一个整数。之后才将结果转换为浮点数,但为时已晚。解决此问题的最简单方法是使用浮点文字 2.0
而不是 2
。这是有效的,因为 2.0
是双精度数,当您将整数除以双精度数时,整数首先转换为双精度数。
num(i,0)=(float)(((i+1)-(N1+1)/2.0));
@john 已经指出了您的错误原因。我只想指出,在 Eigen 中有一个 built-in function LinSpaced
用于您想要执行的操作:
int N1=10;
MatrixXf P; // consider using VectorXf here
float const limit = 0.5f*(N1-1);
P = VectorXf::LinSpaced(N1, -limit, +limit);
我正在使用 Eigen 库编写一个 C++ 程序,当我执行我的代码时,我得到了我的变量 P 作为
`-4 -3 -2 -1 0 1 2 3 4 5`
但应该是-4.5 -3.5-2.5-1.5-0.5 1.5 2.5 3.5 4.5
这些数字正在四舍五入到最接近的整数 infinity.Please 帮助我找到问题的解决方案。
#include<iostream>
#include<math.h>
#include<stdlib.h>
#include<eigen3/Eigen/Dense>
#include<eigen3/Eigen/Core>
using namespace Eigen;
using namespace std;
using Eigen::MatrixXd;
using Eigen::MatrixXf;
MatrixXf create_linear_array(int &N1 , double &dx)
{
int i;MatrixXf num(10,1);
for(i=0;i<10;i++)
num(i,0)=(float)(((i+1)-(N1+1)/2));
return num;
}
int main()
{
//---------------------INITIALISATION & DECLARATION------------------------------
double dx=0.030;
int N1=10;
MatrixXf P;
P=create_linear_array(N1,dx);
cout<<P<<endl;
return 0;
}
你正在做整数除法,整数除法的结果总是一个整数。之后才将结果转换为浮点数,但为时已晚。解决此问题的最简单方法是使用浮点文字 2.0
而不是 2
。这是有效的,因为 2.0
是双精度数,当您将整数除以双精度数时,整数首先转换为双精度数。
num(i,0)=(float)(((i+1)-(N1+1)/2.0));
@john 已经指出了您的错误原因。我只想指出,在 Eigen 中有一个 built-in function LinSpaced
用于您想要执行的操作:
int N1=10;
MatrixXf P; // consider using VectorXf here
float const limit = 0.5f*(N1-1);
P = VectorXf::LinSpaced(N1, -limit, +limit);