我正在编写一个程序,计算在此给我的正态分布函数的值:
该程序应该向用户询问上面显示的正态分布的均值μ和标准偏差σ。然后,程序要求 N 个 x 值,然后一个一个地要求每个 x 值。在每个值 x 之后,它将写出函数的相应值。
到目前为止,这是我的代码:
#define _USE_MATH_DEFINES
#include <stdio.h>
#include <math.h>
int main() {
int j;
double u, stddev, N, result, x;
printf("Enter u and stddev for the Normal Distribution:\n");
scanf("%lf %lf",&u, &stddev);
printf("Enter how many values of x (N) for the Normal Distribution:\n");
scanf("%lf",&N);
for (j=0; j<N; j++) {
printf("Enter a value for x: \n");
scanf("%lf",&x);
result = ((1)/(stddev*sqrt(2*M_PI)))*exp(-(1/2)*((x-u)/stddev)*((x-u)/stddev));
printf("%.6lf\n", result);
}
}
我基本完成了,但是与我的计算器给出的答案相比,程序给出的答案是错误的。例如,当我使 N = 3时,无论我为 x 的3个值加上什么,当它们不应该设置为3时,它给我的答案都是相同的是。
所以我知道我的问题出在这行代码中:
result = ((1)/(stddev*sqrt(2*M_PI)))*exp(-(1/2)*((x-u)/stddev)*((x-u)/stddev));
我只是在程序中编写了错误的函数吗?我一定是,因为它不起作用。
答案 0 :(得分:1)
您的代码干净且功能正常。到目前为止工作很好。
关于哪一行需要更改,您是正确的-问题是使用整数除法会得出整数,因此1 / 2
会得出0
的值。可以通过使用单个双精度值0.5
或使用双精度1.0 / 2.0
来解决。
result = ((1)/(stddev*sqrt(2*M_PI)))*exp(-(0.5)*((x-u)/stddev)*((x-u)/stddev));
在进行了try it online的这些更改之后,我测试了您的代码,它们与wolfram alpha上的公式以及您在注释中所说的完全匹配。
例如:
μ=2, σ=3, x=7 results in 0.033159
μ=3, σ=7, x=0 results in 0.051991
μ=4, σ=4, x=4 results in 0.099736