【发布时间】:2013-05-17 00:44:32
【问题描述】:
我一直在尝试将一些 MATLAB 代码翻译成 C,但是一个特定的函数在两种语言之间给了我不同的结果。我不认为这是一个精度错误,因为变量的值并没有大得惊人或小得惊人。我将不时发布代码,然后提供有关变量值的信息:
Preproccesor 指令(此文件已链接):
#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 中的问题,是因为我能够使用 google 作为计算器来验证 MATLAB 编号。
我使用 gcc 编译,因为 g++ 抱怨我使用 #include<complex.h> 而不是 #include<complex>。
谁能告诉我这是为什么以及如何纠正它?如果有任何问题或需要查看更多代码,请告诉我。
其他注释(没有导致更改):
- 我在 linux 和 OS X(两个不同的系统)上试过这个
- 尝试
pow()而不是(x2-x1)*(x2-x1) - 将数字直接放入 C 和 MATLAB 函数中,以说明我打印出的显示数字中的任何四舍五入
- 打印出每个输入以确保它们相同,并检查是否使用了正确的数据类型
【问题讨论】:
-
matlab没有to-C编译器组件吗?此外,C 中的浮点类型并不准确,在算术运算尤其是除法之后容易累积很多错误。另外,使用
1.0/2.0 -
长话短说,不要使用原生 C 浮点数进行精确的科学计算。
-
几乎可以肯定是浮点精度的差异。我的猜测是c版本使用单精度,而matlab版本使用双精度。
-
它以纯文本表示他正在使用双精度浮点
-
明显的起点:将
1/2更改为1.0/2.0。 IMO,您可能应该发布您尝试实现的公式(以正常的数学表示法),以便我们可以验证您的 C 代码是否正确。
标签: c++ c matlab precision floating-accuracy