回 帖 发 新 帖 刷新版面

主题:[讨论]求大神帮我看看我编的程序为什么一测试就有问题,求解!!!

#include<stdio.h>
#include<math.h>
double sin(double x)
{
double a,y;
int n;
a=x;
y=x;
    for(n=1;y<1e-11;n++)
{
a=-a*x*x/(2*n*(2*n-1));
y=y+a;
    }
return y;
}
void main()
{
double x,b;
printf("度数是:");
scanf("%lf",&x);
b=(double) fmod(x,360)*3.1415926/180;
printf("函数值是:%lf",sin(b));
}

回复列表 (共10个回复)

沙发

请描述你的问题
若 编译不通过,请给出编译器给出的错误提示
若 运行结果不符合你的预期,请给出 你的输入、实际输出,以及你的预期输出

板凳

是数据不对。
输入:30度(角度制,编译的程序内部已经转换成弧度制)。
输出:0.523599(无论如何让调整精度,都是这个结果)。预期是0.500000
输入:180度
输出:3.141593.
输入:360度
输出:陷入死循环,一直没有输出值。
大神,这是为什么啊!!sin函数用的是泰勒公式去近似计算的,老师为了要我们了解函数的定义和调用,才要我们做这个题目的。可是我检查了好多遍,没有发现错误,测试结果就是不对,我的其他同学变出来的程序都是看起来没错,一带数据检测就不对了!!!!

3 楼


你的循环好像没有进行,我调试了一下是没进入循环体,你得到的结果是fmod(x,360)*3.1415926/180的结果

4 楼


怎么该啊?大神求解!!!

5 楼

我Google了一下泰勒公式,是
sin(x) = x-x^3/3!+x^5/5!-x^7/7!+x^9/9!-……

[code=c]
#include <stdio.h>
#include <math.h>

#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif

double mysin(double x) // 不要和标准库中的sin重名
{
    double a=x, y=x;
    int n;
    for( n=1;fabs(a)>1e-11;n++) // 原先写的是y<1e-11
    {
        a=-a*x*x/(2*n*(2*n+1)); // 原先写的是2*n-1
        y=y+a;
    }
    return y;
}

int main() // 按标准返回类型必须是int
{
    double x,b;
    printf("度数是:");
    scanf("%lf",&x);
    b= fmod(x,360)*M_PI/180;
    printf("函数值是:%f",mysin(b)); // 按标准,在printf中float/double都用%f,%Lf是给long double用的

    return 0;
}
[/code]

6 楼

果然是大神!!真的可以了,但有些不明白!!为什么主函数用int而不是void

7 楼


我试了一下,用void也可以的,还有最后的那个lf也可以不用改的,总之谢谢大神了!!!

8 楼

为什么主函数用int而不是void
------ 我已经说了,因为C/C++标准一直都规定main的返回类型为int。这个没有为什么,就这么规定的

最后的那个lf也可以不用改的
------ 我已经说了,C/C++标准的printf规定double对应%f。你不能因为某个不符合标准的编译器中long double等同于double,就认为C/C++标准中long double等同于double。

9 楼

有资料可解哦


选择千锋 选择卓越 千锋3G 手机软件开发培训第一品牌

[url=http://www.mobiletrain.org/]iOS培训[/url] [url=http://www.mobiletrain.org/]北京iOS培训[/url]

10 楼

拜托,泰勒公式算的是弧度

我来回复

您尚未登录,请登录后再回复。点此登录或注册