不应该是C函数返回0

时间:2018-06-13 07:54:53

标签: c return-value numerical

我在C中制作了一组函数,用于模拟一个微正方形的序列(具有固定能量和体积的N个粒子的周期性有界盒子)。关键是我的一个主要功能是以获得2个粒子之间的距离,而有时它会返回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中的一个例子

1 个答案:

答案 0 :(得分:3)

问题来自abs函数,它将返回一个整数:

#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