在 MATLAB 和 C 中四舍五入到所需的数字

rounding to desired digits in MATLAB and C

我已经阅读了有关在 C 中实现舍入的问题,受 MATLAB 舍入函数的启发,我听从了他们的建议,但结果根本不是它应该是的。这是我关于此问题的部分代码:

    movmean_h[i]=(double)sum/(f-b);
    mexPrintf("\t movmean_h[%d]=%e",i,movmean_h[i]);
    movmean_h[i]=(double)round(movmean_h[i]*n)/n;
    mexPrintf("\t movmean_h[%d]=%e",i,movmean_h[i]);

部分结果是这样的(这段代码是运行循环):

 movmean_h[10261]=2.283693e-13   movmean_h[10261]=1.668138e-06
 movmean_h[10261]=2.283693e-13   movmean_h[10261]=1.668138e-06
 movmean_h[10262]=2.288172e-13   movmean_h[10262]=1.483963e-06
 movmean_h[10263]=2.292687e-13   movmean_h[10263]=-8.838173e-07
 movmean_h[10264]=2.297219e-13   movmean_h[10264]=0.000000e+00
 movmean_h[10265]=2.292835e-13   movmean_h[10265]=2.138378e-06
 movmean_h[10266]=2.288319e-13   movmean_h[10266]=1.409754e-06
 movmean_h[10267]=2.283839e-13   movmean_h[10267]=0.000000e+00
 movmean_h[10268]=2.279412e-13   movmean_h[10268]=-2.147484e-06
 movmean_h[10269]=2.275056e-13   movmean_h[10269]=-2.147484e-06
 movmean_h[10270]=2.270787e-13   movmean_h[10270]=-2.147484e-06
 movmean_h[10262]=2.288172e-13   movmean_h[10262]=1.483963e-06
 movmean_h[10263]=2.292687e-13   movmean_h[10263]=-8.838173e-07
 movmean_h[10264]=2.297219e-13   movmean_h[10264]=0.000000e+00
 movmean_h[10265]=2.292835e-13   movmean_h[10265]=2.138378e-06
 movmean_h[10266]=2.288319e-13   movmean_h[10266]=1.409754e-06
 movmean_h[10267]=2.283839e-13   movmean_h[10267]=0.000000e+00
 movmean_h[10268]=2.279412e-13   movmean_h[10268]=-2.147484e-06
 movmean_h[10269]=2.275056e-13   movmean_h[10269]=-2.147484e-06
 movmean_h[10270]=2.270787e-13   movmean_h[10270]=-2.147484e-06

答案根本不匹配,顺序不对,小数点也不对,理论上它们是匹配的。

而'n'定义为:

long int n=pow(10,15);

所以我的问题是为什么我的代码是错误的,或者是我遗漏了什么? 顺便说一下,我正在为 MATLAB mex 文件编写 C 代码。

10^15 不适合 Windows 机器上的 long int。使用 double.

double n = pow(10, 15);
movmean_h[i]=(double)sum/(f-b);
mexPrintf("\t movmean_h[%d]=%e",i,movmean_h[i]);
movmean_h[i]=round(movmean_h[i]*n)/n;
mexPrintf("\t movmean_h[%d]=%e",i,movmean_h[i]);

代码缺少 double round() 的声明声明。较旧的编译器允许这样做,但会解释结果然后 int。代码输出然后非常奇怪。对我来说,提示是许多附近的 double 输入具有相同的结果。

// add
#include <math.h>