C 函数 returns 0 什么时候不应该
C function returns 0 when shouldn't
我正在用 C 编写一组函数来模拟微正则集合(一个具有固定能量和体积的 N 个粒子的周期性有界框)。关键是我的主要功能之一是 获取 2 个粒子之间的距离 ,并且 有时它 returns 0 即使粒子不是那么近.
函数是
// Determinar la mínima distancia dadas dos coordenadasy una longitud de caja periodica
float pdist(float x1, float y1, float x2, float y2, float a) {
float Dx = abs(x2-x1);
float Dy = abs(y2-y1);
if(Dx >a/2) Dx = a-Dx;
if(Dy >a/2) Dy = a-Dy;
return sqrt(pow(Dx,2)+pow(Dy,2));
}
如果你想看所有的代码,你可以在
https://gitlab.com/jarr.tecn/statistical_mechanics
在文件中 box.h
和 ejemplo.h
中的一个示例
问题来自 abs
函数,它将 return 一个整数:
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
float pdist(float x1, float y1, float x2, float y2, float a) {
float Dx = abs(x2-x1);
float Dy = abs(y2-y1);
if(Dx >a/2) Dx = a-Dx;
if(Dy >a/2) Dy = a-Dy;
return sqrt(pow(Dx,2)+pow(Dy,2));
}
float pdist2(float x1, float y1, float x2, float y2, float a) {
float Dx = fabsf(x2-x1);
float Dy = fabsf(y2-y1);
if(Dx >a/2) Dx = a-Dx;
if(Dy >a/2) Dy = a-Dy;
return sqrt(pow(Dx,2)+pow(Dy,2));
}
int main(void)
{
printf("first form: %f\n", pdist(.1, .1, .2, .2, .5));
printf("second form: %f\n", pdist2(.1, .1, .2, .2, .5));
}
给出:
first form: 0.000000
second form: 0.141421
我正在用 C 编写一组函数来模拟微正则集合(一个具有固定能量和体积的 N 个粒子的周期性有界框)。关键是我的主要功能之一是 获取 2 个粒子之间的距离 ,并且 有时它 returns 0 即使粒子不是那么近.
函数是
// Determinar la mínima distancia dadas dos coordenadasy una longitud de caja periodica
float pdist(float x1, float y1, float x2, float y2, float a) {
float Dx = abs(x2-x1);
float Dy = abs(y2-y1);
if(Dx >a/2) Dx = a-Dx;
if(Dy >a/2) Dy = a-Dy;
return sqrt(pow(Dx,2)+pow(Dy,2));
}
如果你想看所有的代码,你可以在 https://gitlab.com/jarr.tecn/statistical_mechanics
在文件中 box.h 和 ejemplo.h
中的一个示例问题来自 abs
函数,它将 return 一个整数:
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
float pdist(float x1, float y1, float x2, float y2, float a) {
float Dx = abs(x2-x1);
float Dy = abs(y2-y1);
if(Dx >a/2) Dx = a-Dx;
if(Dy >a/2) Dy = a-Dy;
return sqrt(pow(Dx,2)+pow(Dy,2));
}
float pdist2(float x1, float y1, float x2, float y2, float a) {
float Dx = fabsf(x2-x1);
float Dy = fabsf(y2-y1);
if(Dx >a/2) Dx = a-Dx;
if(Dy >a/2) Dy = a-Dy;
return sqrt(pow(Dx,2)+pow(Dy,2));
}
int main(void)
{
printf("first form: %f\n", pdist(.1, .1, .2, .2, .5));
printf("second form: %f\n", pdist2(.1, .1, .2, .2, .5));
}
给出:
first form: 0.000000
second form: 0.141421