gpt4 book ai didi

c++ - C编程: translated function from MATLAB to C gives slightly (but significantly) different result

转载 作者:太空宇宙 更新时间:2023-11-04 02:09:13 24 4
gpt4 key购买 nike

我一直在尝试将一些 MATLAB 代码翻译成 C,但一个特定的函数在两种语言之间给出了不同的结果。我不认为这是一个精度错误,因为变量的值不是惊人的大或小。我现在将发布代码,然后提供有关变量值的信息:

预处理器指令(此文件已链接):

#include "ff_addfunc.h"
#include <stdio.h>
#include <stdlib.h>
//#include <complex.h> (already included in the header file)
#include <math.h>
#ifndef HBAR
#define HBAR 1
#endif
#ifndef SPRING_CONST
#define SPRING_CONST 1
#endif
#ifndef PI
#define PI 3.14159265359
#endif

紧接着是 C 中的问题函数,下面是 MATLAB 中的相同函数。在调用此函数之前,两者之间的所有数值结果都匹配。我发现的是 x1 == x2 , MATLAB 和 C 就结果达成一致;但是当x1 != x2 , C 返回一个略有不同的结果,我将在下面显示。这意味着减号左边的算术导致了问题。

这是 C 代码:

double lagrangian(double x1,double x2,double dt,double m) {
return 1/2*m*(x2-x1)*(x2-x1)/dt/dt-SPRING_CONST*(x2*x2+x1*x1)/4;
}

这是 MATLAB 的等价物:

function L = Lagrangian(x1,x2,dt,m)

k = 1;
L = 1/2*m*(x2-x1).^2./dt.^2-k*(x2.^2+x1.^2)/4;

我发现如果我有 x1 = -4 , x2 = -3.986667 , dt = 0.049087 , 和 m = 1 C 函数返回 -7.973378而 MATLAB 给我 -7.9365 .现在,我将其记为 C 而不是 MATLAB 中的问题的原因是因为我能够使用谷歌作为计算器来验证 MATLAB 数字。

我使用 gcc 编译,因为 g++ 提示我使用 #include<complex.h>而不是 #include<complex> .

谁能告诉我这是为什么以及我该如何纠正它?如果有任何问题或者您需要查看更多代码,请告诉我。

其他说明(没有导致更改):

  • 我在 linux 和 OS X(两个不同的系统)上试过这个
  • 尝试过 pow()而不是 (x2-x1)*(x2-x1)
  • 将数字直接放入 C 和 MATLAB 函数中,以解决我打印出的显示数字中的任何舍入
  • 打印出每个输入以确保它们相同并检查是否使用了正确的数据类型

最佳答案

在 C 中,/* 具有相同的优先级并且从左到右关联。这意味着在这个子表达式中:

1/2*m*(x2-x1)*(x2-x1)/dt/dt

子表达式 1/2 被分组。因为 12 都是 int 常量,所以这是一个整数除法 - 即截断。 1/2 在 C 中始终为零,因此整个子表达式变为零。

改用 1.0/2.0(或只是 0.5)。

关于c++ - C编程: translated function from MATLAB to C gives slightly (but significantly) different result,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16683738/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com