Cos函数给我零

时间:2018-03-25 02:32:56

标签: c++

我是编程的完全初学者,我获得了以下任务:

编写一个C ++程序,使用一系列内切和外接的正多边形来计算一对π的估计。在不超过30步之后停止,或当外接和内接多边形的周长之间的差小于ε= 10 -10的容差时。您的输出应该有三列,用于边数,内接多边形的周长和外接多边形的周长。对于最后两列,在小数点后显示14位数。

好吧,我决定使用cos定律来找到多边形边长,但是当我测试我的程序时,我意识到了这条线: a = cos(360 / ngon); 继续给我零作为输出,使其他一切也为零,我不知道有什么不对请帮助。 附:对不起,如果程序看起来很草率,我真的很擅长这个。

#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <fstream>
#define _USE_MATH_DEFINES
#include <math.h>
#include <cmath>


using namespace std;
int main()
{
	char zzz;
	int ngon = 3, a, ak;
	double insngon = 0.0;
	double cirngon = 0.0;
	cout << "Number of Sides" << "\t\t\t" << "Perimeter of insribed region" << "\t\t\t" << "Perimeneter of circumscribed polygon" << "\t\t" << "\n";
	while (ngon <= 30)
	{
		a = cos(360 / ngon);
		ak = pow(.5, 2) + pow(.5, 2) - 2 * .5*.5*a;
		insngon = (ak*ngon);
		cirngon = (ak / (sqrt(1 - pow(ak, 2))));
		cout << fixed << setprecision(14) << ngon << "                               " << insngon << "                                " << cirngon << endl;
		ngon++;
		if (cirngon - insngon <= pow(10.0, -15));
		cin >> zzz;
		return 0;

	}
	cout << "\nEnter any character and space to end ";
	cin >> zzz;
	return 0;
}

2 个答案:

答案 0 :(得分:2)

一个问题是您声明了整数,但是您在cos的调用中使用了它们:

int ngon = 3, a, ak;
//...
a = cos(360 / ngon);

由于a是一个整数,因此cos(类型为double)的返回值将被截断。此外,由于ngon是整数,360 / ngon也会截断。

修复方法是adouble,并将360.0除以ngon以防止截断:

int ngon = 3, ak;
double a;
//...
a = cos(360.0 / ngon);

正如评论中指出的那样,另一个问题是C ++中的三角函数使用弧度作为参数,而不是度。您需要将参数更改为以弧度为单位的等效值。

另一个问题是您使用pow来计算不变的值。不需要引入不必要的函数调用来计算常量值。只需定义常量并使用它们。

例如:

const double HALF_SQUARED = 0.25
const double EPSILON_VALUE = 10.0e-15;

然后使用HALF_SQUAREDEPSILON_VALUE代替对pow的调用。

此外,pow本身就是一个浮点函数,因此可能会产生不完全as is discussed by this question的结果。因此,pow(ak, 2)应该只用ak * ak替换。

答案 1 :(得分:0)

使用float a;(或加倍)代替int a。

这里a的返回类型是int 并计算

a = cos(360/ngon)

相当于a = cos(120),即cos(120)的结果是0.8141并且是整数类型&#34; a&#34;只存储它的整数部分。 因此&#39; a&#39;将为0并丢弃浮动值。 也可以使用double ak;代替int ak;。 因为这里使用的pow功能有返回类型&#39; double&#39;