通过公式近似计算并返回 sin(x) 值


编写带有原型的函数:
双 mySin(双 x, 双 epsi);
它大约通过以下公式计算并返回 sin(x) 值:
sin(x) = – + -… +(-1)n
这里 n 是第一个整数 | |  epsi 满意。

我尝试过的:

   double q3() {
       int x;
       int n = 1;
       double p = 0;
       int dau = -1;
       int tongquat2 = 1.0 / (2 * n + 1);
       while (tongquat2 >= 1e-10) {
           tongquat2 = 1.0 / (2 * n + 1);
           p += -1 * dau * pow(-1, n) * pow(x, 2 * n + 1) / (giaithua(2 * n + 1));
           dau *= -1;
           n++;
       }
       return p;
   }
int main(){
   int x;
   scanf("%d", &x);
   printf("sin(%d)= %.6lf", x, q3());
}

为什么代码不正确? 帮我解决错误。

解决方案1

这里可能涉及三种类型的错误,但我们不知道是哪一种:
1) 编译/链接错误:您尝试编译应用程序并在运行之前报告问题。 如果我尝试编译您的代码,如图所示,我必须添加这两行:

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

并添加一个“虚拟定义” giaithua 函数来获得您所显示的代码的干净编译。
在进行干净编译之前,您不会生成 EXE 文件,并且您的应用程序无法运行。
2) 运行时错误:这些错误会阻止您的应用程序继续运行,因为发生了系统无法处理的情况 – 可能是“除以零”错误,或者尝试读取不存在的文件。 =系统向您显示错误消息,并立即终止您的应用程序。
如果不知道消息是什么、消息发生在哪里以及您输入了哪些数据来获取消息,我们无法帮助您解决此问题。
3) 逻辑错误:这意味着您会得到意外的结果,但您的应用程序不会崩溃。 例如,如果您希望应用程序给出的结果为 42,但它却给出了 666。
如果不知道该值是什么、您期望获得什么、何时获得以及您输入了哪些数据来获得它,我们无法帮助您解决此问题。

我将假设它是最后两个之一,并且查找问题的过程需要您的代码与您的数据一起运行 – 我们都没有。 编译通过并不意味着你的代码是正确的! :笑:

所以这取决于你,但你不能靠自己。
将开发过程视为编写电子邮件:成功编译意味着您使用正确的语言(例如英语,而不是德语)编写了电子邮件,而不是电子邮件包含您想要发送的消息。

现在您进入了开发的第二阶段(实际上是第四或第五阶段,但稍后您将进入早期阶段):测试和调试。

首先看看它做了什么,以及它与您想要的有何不同。 这很重要,因为它为您提供了有关这样做的原因的信息。 例如,如果一个程序打算让用户输入一个数字,然后将其加倍并打印答案,那么如果输入/输出如下所示:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16

那么很明显,问题在于将其加倍的位 – 它不是将自身与自身相加,或将其乘以 2,而是将其与自身相乘并返回输入的平方。
因此,您可以查看代码,很明显它位于此处:

C#
private int Double(int value)
   {
   return value * value;
   }

一旦您知道可能出了什么问题,就开始使用调试器来找出原因。 在方法的第一行放置一个断点,然后运行您的应用程序。 当到达断点时,调试器将停止,并将控制权交给您。 现在,您可以逐行运行代码(称为“单步执行”),并根据需要查看(甚至更改)变量内容(哎呀,您甚至可以更改代码,然后根据需要重试)。
在执行代码之前,请考虑代码中的每一行应该执行的操作,并将其与使用“Step over”按钮依次执行每一行时实际执行的操作进行比较。 它达到了你的预期吗? 如果是这样,请转到下一行。
如果没有,为什么不呢? 有什么不同?
希望这可以帮助您找到代码的哪一部分有问题以及问题是什么。
这是一项技能,而且非常值得培养,因为它可以帮助您在现实世界中以及在开发中。 和所有技能一样,它只会通过使用而提高!

解决方案2

无需仔细查看 q3() 函数,就可以清楚地看出它无法计算 sin(),因为没有传递参数。

C
int main() {
    int x;
    scanf("%d", &x);
    printf("sin(%d)= %.6lf", x, q3());
}

//编辑:
乍一看,编译器会警告您这一点:

C
int n = 1;
int tongquat2 = 1.0 / (2 * n + 1);
while (tongquat2 >= 1e-10) { ...

从“double”转换为“int”,可能会丢失数据!
所涉及的数据类型不合适,也可能发生算术溢出。

即使 giaithua() 返回一个有意义的值,值得注意的是 x 并未初始化。

コメント

タイトルとURLをコピーしました