【问题标题】:C function returns 0 when shouldn't [closed]C函数在不应该时返回0 [关闭]
【发布时间】:2018-06-13 07:54:53
【问题描述】:

我正在用 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中 以及 ejemlo.h 中的一个示例

【问题讨论】:

  • 你能给我们一个示例输入,它意外返回 0 吗?
  • if 条件的部分应该做什么?
  • 您不应该使用pow 进行平方。使用sqrt(Dx*Dx + Dy*Dy)
  • 函数怎么调用?
  • 为什么两个粒子之间的距离是a的函数?

标签: c return-value numerical


【解决方案1】:

问题来自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

【讨论】:

    猜你喜欢
    • 2016-09-24
    • 1970-01-01
    • 2019-04-24
    • 2013-07-15
    • 2020-07-05
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 2022-11-19
    相关资源
    最近更新 更多