0

我正在为一种极其简单的编程语言制作一个正弦函数的原型(即,限制仅限于有符号的 int 变量类型,并且仅限于变量之间的操作)。但是,对于大于或等于 0.9 的“s”的给定值,似乎每个弧度左右都会出现错误。这个错误似乎是偏移量 1,然后是小范围的 -1(这都在同一个错误内 - 1 和 -1 是连续的,没有任何正确的输出值)。这个错误没有出现在具有相同功能的desmos图上(desmos图中的错误是近似值之间的小跳跃)。我确实假设 pi 和 tau 的近似值会出现问题,但它似乎在其他方面为“s”赋予了更大的值。我的代码如下:

#include <iostream>

int sin(int x, int s1, int s2)
{
  int p = x;
  int pi = 314159;
  int k = 1000;
  int tau = 628318;
  int six = 6;
  int oneHundredTwenty = 120;
  int fiveThousandFourty = 5040;
  int ans;
  int a3;
  int a5;
  int a7;
  float s = 0.9;

  pi *= s;
  pi /= 100;
  tau *= s;
  tau /= 100;
  k *= s;

  p %= tau;
  p -= pi;

  a3 = p;
  a5 = p;
  a7 = p;

  ans = p;


  a3 *= p;
  a3 /= k;
  a3 *= p;
  a3 /= k;
  a3 /= six;

  a5 *= p;
  a5 /= k;
  a5 *= p;
  a5 /= k;
  a5 *= p;
  a5 /= k; 
  a5 *= p;
  a5 /= k;
  a5 /= oneHundredTwenty;

  a7 *= p;
  a7 /= k;
  a7 *= p;
  a7 /= k;
  a7 *= p;
  a7 /= k;
  a7 *= p;
  a7 /= k;
  a7 *= p;
  a7 /= k;
  a7 *= p;
  a7 /= k;
  a7 /= fiveThousandFourty;

  ans -= a3;
  ans += a5;
  ans -= a7;

  return 30 + ans / 33;

}

int main()
{

  for(int i = 0; i < 1000; i ++)
  {
    for(int j = 0; j < sin(i * 100, 1, 1); j ++)
    {
      std::cout << "#";
    }
    std::cout << "\n";
  }
  return 0;
}
4

1 回答 1

1

你的a7变量溢出了。

在您的代码中, 的值a7大到 2,431,570,725,小到 -2,443,460,910。你的int范围可能几乎,但不完全,那么大。典型值为INT_MAX2,147,483,647。

将其更改为longorlong long或类似的东西。

于 2021-10-27T03:31:45.180 回答