Как правильно использовать свойства exp и sqrt

- использовать двойную точность - использовать sqrt() и экспоненциальную функцию exp() - использовать * для вычисления квадрата - не использовать pow()

Я получаю значения, они просто не соответствуют тому, что я ожидал. Я попытался сделать их все подписанными, но это ничего не изменило, и я попытался распечатать с 12 знаками после запятой, и ничего не работает. Я связал математическую библиотеку и также определил ее.

double normal(double x, double sigma, double mu)
{   
     double func = 1.0/(sigma * sqrt(2.0*M_PI));
     double raise = 1.0/2.0*((x-mu)/sigma);
     double func1 = func * exp(raise);
     double comp_func = (func1 * func1);

     return comp_func;
}
int main(void)
{
// create two constant variables for μ and σ
const double sigma, mu;
//create a variable for x - only dynamic variable in equation
unsigned int  x;

//create a variable for N values of x to use for loop
int no_x;

//scaniing value into mu
printf("Enter mean u: ");   
scanf("%lf", &mu);

//scanning  value into sigma
printf("Enter standard deviation: ");   
scanf("%lf", &sigma);

//if sigma = 0  then exit
if(sigma == 0)
{
    printf("error you entered: 0");
    exit(0);
}

//storing number of x values in no_x
printf("Number of x values: "); 
scanf("%d", &no_x);

//the for loop where i am calling function normal N times
for(int i = 1; i <= no_x; i++)
{

    //printing i for the counter in prompted x values
    printf("x value %d : ", i);

    // scanning in x
    scanf("%lf", &x);


    x = normal(x,sigma,mu);

    printf("f(x) = : %lf.12", x);

    printf("\n");
}

return 0;   
}

C:>.\a.exe Введите среднее значение u: 3,489 Введите стандартное отклонение s: 1,203 Количество значений x: 3 x значение 1: 3,4 f(X) = 0,330716549275 x значение 2: -3,4 f(X) = 0,000000025104 x значение 3:4 f(X) = 0,303015189801

Но это то, что я получаю

C:\Csource>a.exe Введите среднее значение u: 3,489 Введите стандартное отклонение: 1,203 Количество значений x: 3 x значение 1 : 3,4 f(x) = : 15086080,000000 x значение 2 : -3,4 f(x) = : 15086080,000000 x значение 3 : 4 f(x) = : 1610612736,000000


person JJCFTW    schedule 08.02.2019    source источник
comment
Кажется маловероятным, что код, который вы разместили, является кодом, который вы скомпилировали и выполнили. Опубликованный код не включает <math.h>, <stdio.h> и <stdlib.h>. Он передает адреса sigma и mu в scanf, но это const, а scanf требует указателей на то, что не const. Он также передает x в scanf для %lf, но x объявлен как unsigned int, а %lf требует double. Если ваш компилятор не является чрезвычайно толерантным и вы не проигнорировали предупреждающие сообщения, это не должно было скомпилироваться.   -  person Eric Postpischil    schedule 09.02.2019
comment
Я включил '‹math.h›' и оба стандарта вместе с определением. Мой код скомпилирован с помощью gcc. Так что, возможно, это было необычайно терпимо, но я не получил ни одного предупреждающего сообщения.   -  person JJCFTW    schedule 09.02.2019


Ответы (2)


Вставьте эти строки:

#include <math.h>
#include <stdio.h>
#include <stdlib.h>

Сдача:

const double sigma, mu;

to:

double sigma, mu;

Сдача:

unsigned int x;

to:

double x;

Замените определение функции normal на:

double normal(double x, double sigma, double mu)
{   
     double func = 1.0/(sigma * sqrt(2.0*M_PI));
     double t = (x-mu)/sigma;
     return func * exp(-t*t/2);
}
person Eric Postpischil    schedule 09.02.2019
comment
Введите среднее значение u: 3,489 Введите стандартное отклонение: 1,203 Количество значений x: 3 x значение 1 : 3,4 f(x) = : 0,118418273907 x значение 2 : -3,4 f(x) = : 33,750765560558 x значение 3 : 4 f(x) =: 0.071913926152 Это результаты, которые я получаю от этой функции double normal(double x, double sigma, double mu) { double func = 1.0/(sigma * sqrt(2.0*M_PI)); double t = ((x-mu)/sigma); double t2 = -0.5 * t ; double fun = func * exp(t2); return fun * fun ; } - person JJCFTW; 10.02.2019

#define _CRT_SECURE_NO_WARNINGS
#define _USE_MATH_DEFINES
#ifndef M_PI
#define M_PI (3.14159265358979323846)
#endif
#include<math.h>
#include<stdio.h>
#include <stdlib.h>

double normal(double x, double sigma, double mu)
{    
 double func = 1.0/(sigma * sqrt(2.0*M_PI));
 double t = (x-mu)/sigma;
 return func * exp((-0.5*t)* t);
}

Я, наконец, получил этот код, работающий после того, как настраивал его буквально весь день, лол, математика C может быть довольно сложной, спасибо за помощь выше.

person JJCFTW    schedule 10.02.2019