我正在为一种极其简单的编程语言制作一个正弦函数的原型(即,限制仅限于有符号的 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;
}