我怎样才能解决在C++中sin(M_PI)不为0的事实?

Ada*_*dam 14 c++ trigonometry cmath

在C++中,

const double Pi = 3.14159265;
cout << sin(Pi);                          // displays: 3.58979e-009
Run Code Online (Sandbox Code Playgroud)

它应该显示数字零

我明白这是因为Pi是近似的,但是有没有什么方法可以让Pi硬编码到我的程序中,为sin(Pi)返回0?(可能是一个不同的常数?)

如果你想知道我想要做什么:我将极性转换为矩形,虽然有一些printf()技巧我可以做到打印为"0.00",它仍然不会一直返回正常值(在某些情况下,我得到"-0.00")

需要sin和余弦的线是:

x = r*sin(theta);
y = r*cos(theta);
Run Code Online (Sandbox Code Playgroud)

BTW:我的矩形 - > Polar工作得很好......它只是Polar - > Rectangular

谢谢!

编辑: 我正在寻找一个解决方法,以便我可以打印罪(Pi的一些倍数)作为一个很好的圆数到控制台(理想情况下没有一千个if语句)

Ash*_*ain 28

每个计算机科学家应该知道的关于浮点运算的内容(编辑:在评论中也有联系)是相当硬核的阅读(我不能声称已经阅读了所有内容),但其关键在于:你会从来没有得到完全准确的浮点计算.来自文章:

将无限多个实数压缩成有限数量的比特需要近似表示.

不要让程序依赖于浮点计算的精确结果 - 始终允许公差范围.仅供参考3.58979e-009约为0.0000000036.这完全在你选择的任何合理的公差范围内!


vla*_*adr 15

让我们把这种方式,3.58979e-009尽可能接近 0作为你的3.14159265价值是真实的皮.从技术上讲,你得到的是你所要求的.:)

现在,如果您只输入9个有效数字(小数点后8位),则指示输出也不再显示,即使用:

cout.precision(8);
cout << sin(Pi);
Run Code Online (Sandbox Code Playgroud)

  • 嗯?距离几乎完全相同(正如您对泰勒定理所期望的那样). (2认同)