Десятичные точки не сохраняются, как ожидалось, когда в определении функции используется библиотека Eigen

Я делаю программу на C ++ с использованием библиотеки Eigen, и когда я выполнил свой код, я получил свою переменную 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
Числа округляются до ближайших целых чисел до бесконечности. Пожалуйста, помогите мне найти решение моей проблемы.

#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;}

0

Решение

Вы делаете целочисленное деление, а результатом целочисленного деления всегда является целое число. Только после этого вы бросаете результат на плавание, но тогда уже слишком поздно. Самый простой способ исправить это — использовать литерал с плавающей точкой 2.0 вместо 2, Это работает, потому что 2.0 является двойным, и когда вы делите целое число на двойное, целое число сначала конвертируется в двойное.

num(i,0)=(float)(((i+1)-(N1+1)/2.0));
2

Другие решения

@John уже указал причину вашей ошибки. Я просто хочу отметить, что есть встроенная функция LinSpaced в Eigen для того, что вы хотите сделать:

int N1=10;

MatrixXf P;  // consider using VectorXf here
float const limit = 0.5f*(N1-1);
P = VectorXf::LinSpaced(N1, -limit, +limit);
1

По вопросам рекламы [email protected]