Overflow in C++

Overflow in C++

本文关键字:C++ in Overflow      更新时间:2023-10-16

So..

这是代码:

#include <iostream>
#include <limits>
#include <math.h>
using namespace std;
int main()
{
    unsigned long long i,y,n,x=45;
    unsigned long long factorial = 1;
    for(n = 0; n <= 5; n++)
    {
        y = (pow(-1,n)*pow(x,2*n)) / factorial;
        cout << "COS IS " << y << endl;
    }
    for(int i = 1; i <=n; i++)
    {
        factorial *= 2*i;
    }
}

我溢出了,但我真的不知道为什么。我使用未签名的长长只是为了确保我不会得到但是..我仍然明白。甚至仅限于少量。我试图实现这一点:

https://en.wikibooks.org/wiki/Trigonometry/Power_Series_for_Cosine_and_Sine

但是由于溢出,我真的做不到。你对我能做什么有什么想法吗?我是编程新手,所以请放轻松:D

有很多问题。

  1. 当应使用浮点类型时,请使用整数类型
  2. 使用无符号类型进行有符号计算
  3. 不使用弧度,而是使用度(45° ≈ 0.78539 弧度(
  4. 你不计算循环
  5. 中的阶乘,它总是 1,你只在循环结束时计算它,但为时已晚,无论如何你对阶乘的计算都是错误的。
  6. 算法是错误的,它只是没有按照麦克劳林的疗法做,你需要总结术语,但你只是打印术语。

你可能想要这个:

#include <iostream>
#include <cmath>
using namespace std;
long factorial(int n)
{
  long result = 1;
  for (int i = 1; i <= n; i++)
    result *= i;
  return result;
}
int main()
{
  double x = 0.785398163397448309616;  //PI/4 expectd result COS(PI/4) = 0.7071067
  double mycosinus = 0;
  for (int n = 0; n <= 5; n++)
  {
    mycosinus += (pow(-1, n) * pow(x, 2 * n)) / factorial(2*n);
    cout << "COS IS " << mycosinus << endl;
  }
}

这是计算 5 阶乘的错误算法:

int main()
{
  int n = 5;
  int factorial = 1;
  for (int i = 1; i <= n; i++)
  {
    factorial *= 2 * i;
  }
  cout << "factorial 5 = " << factorial << endl;
}

计算值为 3840 而不是 120。我让你自己找出问题所在。

为了执行这种数学运算,你需要使用像float这样的浮点数,或者double而不是像longintlong long这样的整数类型,因为 sin 和 cos 都可以返回你也不应该使用的负数unsigned