双精度未打印出来
Double not being printed out
在此代码中,我正在制作一个粒子簇并为其分配x,y和z坐标。然后,我正在评估在某个遥远点上由于这个集群而产生的力。该函数directSumUnregularized
计算该力。我想看看这种力量是什么,但无论出于何种原因,它都没有被打印出来。
这是我的代码:
#include <omp.h>
#include <time.h>
#include <iostream>
#include <cmath>
#include <random>
#include "unitTestFunctions.h"
int main() {
//set up cluster of particles
const int numberOfParticles = 10;
std::random_device rd{};
std::mt19937 gen{rd()};
std::normal_distribution<> d{0,1};
PARTICLE *clusterOfParticles = new PARTICLE [numberOfParticles];
double sumX{}, sumY{}, sumZ{};
for (int ind=0; ind<numberOfParticles; ind++){
clusterOfParticles[ind].x = d(gen);
clusterOfParticles[ind].y = d(gen);
clusterOfParticles[ind].z = d(gen);
}
//test position
double xTest {5}, yTest{6}, zTest {7};
double *exactForceX{nullptr}, *exactForceY{nullptr}, *exactForceZ{nullptr};
*exactForceX = 0;
*exactForceY = 0;
*exactForceZ = 0;
directSumUnregularized(numberOfParticles, exactForceX, exactForceY,
exactForceZ, xTest, yTest, zTest,
clusterOfParticles);
std::cout<<"exactForce X: "<<*exactForceX<<std::endl;
delete [] clusterOfParticles;
return 0;
}
和我的功能:
#include <omp.h>
#include <time.h>
#include <iostream>
#include <cmath>
#include <random>
#include "unitTestFunctions.h"
void directSumUnregularized(const int numberOfParticles, double *exactForceX,
double *exactForceY, double *exactForceZ, double xTest, double yTest, double zTest,
PARTICLE *clusterOfParticles){
double rSq{};
double r{};
double dx {}, dy {}, dz{};
const double pi = 3.1415926535897;
double inv4pi = 1/(4*pi);
for (int i=0; i<numberOfParticles; i++){
dx = xTest - clusterOfParticles[i].x;
dy = yTest - clusterOfParticles[i].y;
dz = zTest - clusterOfParticles[i].z;
rSq = dx*dx+dy*dy+dz*dz;
r = sqrt(rSq);
*exactForceX -= inv4pi*(dx/(rSq*r));
*exactForceY -= inv4pi*(dy/(rSq*r));
*exactForceZ -= inv4pi*(dz/(rSq*r));
}
return;
}
我应该怎么做?
关于 exactForceX/Y/Z,为了工作,它必须是这样的:
//test position
double xTest = 6, yTest = 6, zTest = 7;
double exactForceX = 0, exactForceY = 0, exactForceZ = 0;
directSumUnregularized(umberOfParticles, &exactForceX, &exactForceY,
&exactForceZ, xTest, yTest, zTest,
clusterOfParticles);
std::cout << "exactForce X: " << exactForceX << std::endl;
首先,定义(和初始化(3个变量:
double exactForceX = 0, exactForceY = 0, exactForceZ = 0;
2nd,将 3 个地址传递给函数,以允许它存储结果。
有问题的部分是
double *exactForceX{nullptr}, *exactForceY{nullptr}, *exactForceZ{nullptr};
*exactForceX = 0;
*exactForceY = 0;
*exactForceZ = 0;
这到底在做什么?
double *exactForceX{nullptr};
*exactForceX = 0;
您正在创建一个值为 nullptr
的指针,试图取消引用它并分配值 0。取消引用nullptr
是未定义的行为。
要修复它,您需要地址运算符&
double exactForceX = 0;
double exactForceY = 0;
double exactForceZ = 0;
directSumUnregularized(numberOfParticles, &exactForceX, &exactForceY,
&exactForceZ, xTest, yTest, zTest,
clusterOfParticles);
似乎对指针的工作方式存在一些困惑。我喜欢用这样一个简单的例子。
double value = 12345;
double *pointer_to_value = &value;
std::cout << "value " << value << std::endl;
std::cout << "&value " << &value << std::endl;
std::cout << "pointer_to_value " << pointer_to_value << std::endl;
std::cout << "*pointer_to_value " << *pointer_to_value << std::endl;
这将给出如下所示的输出:(地址可能因您而异(
value 12345
&value 0x7ffc601869b0
pointer_to_value 0x7ffc601869b0
*pointer_to_value 12345
要点(呵呵(是指针必须指向有效位置。也就是说,变量的位置或对new
的调用。在这种情况下,有效位置是变量 value
的位置。
另请参阅:什么是分段错误?
相关文章:
- 为什么 std::cout 打印浮点数、双精度和长双精度到相同的小数精度?
- 打印双精度的整个非小数部分
- 什么样的 GCC 优化可能会根据是否打印来更改双精度?
- 在 c++ 中使用浮点数、双精度打印十进制
- 双精度未打印出来
- 如何在不丢失第一位数字的情况下打印出双精度值
- 如何在 for 循环内部或外部打印双精度变量
- 使用 cout 以精度 4 打印双倍
- 长双精度在 MinGW 上打印错误
- 对应该返回的双精度变量进行舍入,而不是打印
- 如何打印具有正确有效小数位数的C++双精度
- 在所有声明的双精度但整数结果中打印带有函数的圆的面积,为什么
- 如何在Qt中打印所有小数的双精度
- 以给定精度在给定方向上四舍五入打印双精度
- 我应该使用wsprintf()将双精度打印为宽字符串吗
- C++程序不打印出字符串,但输出双精度值
- 双精度/打印在c++中不能处理14位数字
- 打印Python和c++双精度值时的精度差异
- 为什么这个双精度值打印为 "-0" ?
- 打印双精度到字符串流时如何避免"exponent"格式