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