gpt4 book ai didi

c++ - 在我下面写的代码中,我想在代码中将 tan 90 的值设为 'INFINITY '。但机器获得更高的数字。我应该如何编辑代码?

转载 作者:行者123 更新时间:2023-12-04 07:49:52 26 4
gpt4 key购买 nike

我想制作一个可以显示所选度数的 sin、cos、tan、cot 值的表格。正如我所说,我无法接受 tan90 的正确答案。我不知道如何将其更改为“无限”。我在等你的帮助! :)

#include<math.h>
#include<stdlib.h>
#include<iostream>

using namespace std;

main()
{

double table[10][4];
int i=0,j=0;
double val=0,PI=3.14159;
val = PI / 180.0;

printf("\tİstenen Tablo\n\t-------------\n");
printf("\t ACI\t\t\t SIN\t\t\t COS\t\t\t TAN\t\t\t COT\n\t------\t\t\t------\t\t\t------\t\t\t---
---\t\t\t------");

for(i=0;i<=90;i+=10)
{
for(j=0;j<5;j++)
{
switch (j)
{
case 0:table[i/10][j] = i; break;
case 1:table[i/10][j] = sin(i*val);break;
case 2:table[i/10][j] = cos(i*val);break;
case 3:table[i/10][j] = tan(i*val);break;
case 4:table[i/10][j] = 1/tan(i*val);break;
}
}
printf("\n\t %lf \t\t %lf\t\t %lf\t\t %lf\t\t %lf\n",table[i/10][0],table[i/10]
[1],table[i/10][2],table[i/10][3],table[i/10][4]);
}
return 0;
}

最佳答案

您得到不正确值的原因是 π不是 3.14159,这只是其实际值的近似值。事实上,任何非无限系列的十进制数字都是近似值,但数字越多,i * val 就越接近。将是您应该传递给三角函数调用的正确值。
更好的值是 M_PI来自 math.h ,它比您目前拥有的精度要高得多。
由于即使 double 的精度有限,您仍然可能无法获得预期值。类型。如果发生这种情况,您将需要在浮点运算之前调整得到的结果。
例如,以下函数可用于获得更可接受的值,在象限边界上强制使用非常特定的值,以避免这些结果中出现不精确的最小可能性:

double mySin(int degrees) {
int mod360 = degrees % 360;

if (mod360 == 0) return 0.0;
if (mod360 == 90) return 1.0;
if (mod360 == 180) return 0.0;
if (mod360 == 270) return -1.0;

return sin(degrees % 360 * M_PI / 180.0);
}

double myCos(int degrees) {
return mySin(degrees + 90);
}

double myTan(int degrees) {
int mod360 = degrees % 360;

if (mod360 == 0) return 0.0;
if (mod360 == 90) return 1.0 / 0.0;
if (mod360 == 180) return 0.0;
if (mod360 == 270) return -1.0 / 0.0;

return tan(mod360 * M_PI / 180.0);
}

double myCot(int degrees) {
// Now that tan() works properly for the quadrant
// boundaries, just use normal formula.

return 1.0 / myTan(degrees);
}
这些是从头开始构建的,以使用度数输入而不是弧度,并且因为您在进行任何浮点数学运算之前捕获了无限值情况(这在处理超越数时本质上是不精确的),所以您可以给出正确的结果那些情况。

一个完整的程序,集成了这些功能并摆脱了你不需要的东西,如下所示。当您可以立即打印值时,将所有这些值存储在一个数组中然后打印出该数组(没有其他用途)是没有意义的:
#include <cmath>
#include <cstdio>

using namespace std;

double mySin(int degrees) {
int mod360 = degrees % 360;

if (mod360 == 0) return 0.0;
if (mod360 == 90) return 1.0;
if (mod360 == 180) return 0.0;
if (mod360 == 270) return -1.0;

return sin(mod360 * M_PI / 180.0);
}

double myCos(int degrees) {
return mySin(degrees + 90);
}

double myTan(int degrees) {
int mod360 = degrees % 360;

if (mod360 == 0) return 0.0;
if (mod360 == 90) return 1.0 / 0.0;
if (mod360 == 180) return 0.0;
if (mod360 == 270) return -1.0 / 0.0;

return tan(mod360 * M_PI / 180.0);
}

double myCot(int degrees) {
// Now that tan() works properly for the quadrant
// boundaries, just use normal formula.

return 1.0 / myTan(degrees);
}

int main()
{
printf("İstenen Tablo\n");
printf("-------------\n");
printf("\t ACI \t SIN \t COS \t TAN \t COT\n");
printf("\t------------\t-----------\t-----------\t-----------\t-----------\n");

for (int i = 0; i < 360; i += 10) {
printf("\t%12d\t%9.9lf\t%9.9lf\t%9.9lf\t%9.9lf\n",
i, mySin(i), myCos(i), myTan(i), myCot(i));
}
return 0;
}
其输出是:
İstenen Tablo
-------------
ACI SIN COS TAN COT
------------ ----------- ----------- ----------- -----------
0 0.000000000 1.000000000 0.000000000 inf
10 0.173648178 0.984807753 0.176326981 5.671281820
20 0.342020143 0.939692621 0.363970234 2.747477419
30 0.500000000 0.866025404 0.577350269 1.732050808
40 0.642787610 0.766044443 0.839099631 1.191753593
50 0.766044443 0.642787610 1.191753593 0.839099631
60 0.866025404 0.500000000 1.732050808 0.577350269
70 0.939692621 0.342020143 2.747477419 0.363970234
80 0.984807753 0.173648178 5.671281820 0.176326981
90 1.000000000 0.000000000 inf 0.000000000
100 0.984807753 -0.173648178 -5.671281820 -0.176326981
110 0.939692621 -0.342020143 -2.747477419 -0.363970234
120 0.866025404 -0.500000000 -1.732050808 -0.577350269
130 0.766044443 -0.642787610 -1.191753593 -0.839099631
140 0.642787610 -0.766044443 -0.839099631 -1.191753593
150 0.500000000 -0.866025404 -0.577350269 -1.732050808
160 0.342020143 -0.939692621 -0.363970234 -2.747477419
170 0.173648178 -0.984807753 -0.176326981 -5.671281820
180 0.000000000 -1.000000000 0.000000000 inf
190 -0.173648178 -0.984807753 0.176326981 5.671281820
200 -0.342020143 -0.939692621 0.363970234 2.747477419
210 -0.500000000 -0.866025404 0.577350269 1.732050808
220 -0.642787610 -0.766044443 0.839099631 1.191753593
230 -0.766044443 -0.642787610 1.191753593 0.839099631
240 -0.866025404 -0.500000000 1.732050808 0.577350269
250 -0.939692621 -0.342020143 2.747477419 0.363970234
260 -0.984807753 -0.173648178 5.671281820 0.176326981
270 -1.000000000 0.000000000 -inf -0.000000000
280 -0.984807753 0.173648178 -5.671281820 -0.176326981
290 -0.939692621 0.342020143 -2.747477419 -0.363970234
300 -0.866025404 0.500000000 -1.732050808 -0.577350269
310 -0.766044443 0.642787610 -1.191753593 -0.839099631
320 -0.642787610 0.766044443 -0.839099631 -1.191753593
330 -0.500000000 0.866025404 -0.577350269 -1.732050808
340 -0.342020143 0.939692621 -0.363970234 -2.747477419
350 -0.173648178 0.984807753 -0.176326981 -5.671281820
请注意无穷大符号和强制零符号之间的差异。虽然两者 0 / 10 / -1可以被视为零(尽管 IEEE754 允许它们,但没有负零), 1 / 0 的值和 -1 / 0给出 +inf-inf分别。
我更高级的数学伙伴可能不同意,但我认为我是对的。

关于c++ - 在我下面写的代码中,我想在代码中将 tan 90 的值设为 'INFINITY '。但机器获得更高的数字。我应该如何编辑代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67040009/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com