My_sine:我的功能出了什么问题?

时间:2010-11-30 06:48:12

标签: c

好的,所以我已经尝试了我能想到的一切,并且无法弄清楚如何使这个程序正常工作。我已经测试了main中使用的所有函数,但无论如何都包含它们,以防它们中存在一些错误。不仅如此,我相信我的错误主要在于。

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

#define PI 3.14159265359

double int_power(double x, int e);


int main()
{
    int my_factorial(int n);
    double my_sine_taylor(double x);
    double my_sine(double x);
    double mod_two_pi(double x);
    double get_double(void);
    void safeGetString(char arr[], int limit)

    char arr[255];
    double x,y,ans;

    printf("Enter a number: ");
    safeGetString(arr[255],255);
    my_sine(mod_two_pi(get_double()));
    printf("The sine is %f \n", ans);

    return 0;
}

/*
int_power should compute x^e, where x is a double and e is an integer.
*/
double int_power(double x, int e)
{
    int i = 0;
    double ans = 1;
    while(i <= e)
    {
        ans = ans*x;
        i++;
    }

    return ans;
}

/*
my_factorial will find the factorial of n
*/
int my_factorial(int n)
{
    int i = n;
    int ans = 1;

    while(i > 0)
    {
        ans = ans*i;
        i = i-1;
    }

    return ans;
}

/*
my_sine_taylor computes the approxmiation
of sin(x) using the taylor series up through x^11/11!
*/
double my_sine_taylor(double x)
{
    return x - int_power(x,3)/my_factorial(3) + int_power(x,5)/my_factorial(5) - 
    int_power(x,7)/my_factorial(7) + int_power(x,9)/my_factorial(9) - 
    int_power(x,11)/my_factorial(11);
}

/*
my_sine(x) should return a very good approximation of sin(x).
It should first reduce x mod 2pi and then map the result into the
upper right quadrant (where the taylor approximation is quite accurate).
Finally, it should use my_sine_taylor to compute the answer.
*/

double my_sine(double x)
{
    double ans;

    if (x >= 0 && x <= PI/2){
        ans = my_sine_taylor(x);
    } else if (x > PI/2 && x <= PI){
        x=PI-x;
        ans = my_sine_taylor(x);
    } else if (x > PI && x <= 3*(PI/2)){
        x = x-PI;
        ans = -(my_sine_taylor(x));
    } else {
        x=2*PI-x;
        ans = -(my_sine_taylor(x));
    }
}

/*
mod_two_pi(x) should return the remainder when x
is divided by 2*pi.  This reduces values like
17pi/2 down to pi/2
*/
double mod_two_pi(double x)
{
    int y;
    y = floor(x/(2*PI));
    x = x - 2*PI*y;
    return x;
}

/*
get_double and safeGetString are used to get floating point
input from the user
*/
double get_double(void)
{
    double x;
    char arr[255];
    x=atof(arr);
}

void safeGetString(char arr[], int limit)
{
    int c, i;
    i = 0;

    c = getchar();
    while (c != '\n'){
        if (i < limit -1){
            arr[i] = c;
            i++;
        }
        c = getchar();
    }
    arr[i] = '\0';
}

1 个答案:

答案 0 :(得分:6)

哦,我......从哪里开始?

让我们看看......


你有这个功能:

double get_double(void)
{

    double x;

    char arr[255];

    x=atof(arr);
}

您可以这样称呼:

my_sine(mod_two_pi(get_double()));

所以你没有发送任何东西,但你期望得到一些有意义的价值。基本上,arr[255]未初始化,因此它保留了垃圾。您正在使用此垃圾并将其转换为atof的浮点数,但这没有任何作用。

如果我不得不猜测,我会说这正是打破你的计划的原因。我在下面写的其余部分只是评论。


出于某种原因,您宣布所有这些功能内部main。我不认为这应该打破任何东西,但肯定是糟糕的编码风格。


my_sine_taylor使用正弦的6元素泰勒近似计算。你确定你需要那么准确吗? 11!非常大,11次幂的某些数字也可能相当大。您可能会引入不必要的舍入或溢出错误。