C++生成三角函数表时如何让tan90度输出为INFINITY
三角函数值表格代码修改方案
现存核心问题
- 原PI常量精度不足,且浮点角度转弧度存在固有舍入误差,即使提高PI精度,90°转换后的弧度值也无法精确等于π/2,调用tan函数只会得到极大数值而非系统定义的无穷大
- 数组维度定义错误:
table[10][4]仅可存储4个字段,实际需要存储角度、sin、cos、tan、cot共5组数值,会触发内存越界 - 特殊边界角度无分支判断,导致0°的cot、90°的tan输出不符合数学定义
具体修改步骤
- 替换低精度PI为双精度全精度圆周率常量,提升普通角度的计算精度
- 修正数组维度为
double table[10][5],匹配存储字段数量,避免越界 - 对0°、90°两个边界角度做硬编码赋值,不依赖三角函数运算结果:
- 0°场景:tan值固定为0,cot值为
INFINITY - 90°场景:tan值为
INFINITY,cot值固定为0
- 0°场景:tan值固定为0,cot值为
- 修正原非标准main函数写法,兼容C++编译规则
- 修正输出格式串的排版错误,保证表格列对齐
修改后可运行代码
#include <cmath> #include <cstdio> #include <iostream> using namespace std; int main() { double table[10][5]; int i = 0, j = 0; const double PI = 3.14159265358979323846; double rad_per_deg = PI / 180.0; printf("\t三角函数值表(0°~90°,步长10°)\n\t----------------------------------------\n"); printf("\t角度\t\t sin\t\t cos\t\t tan\t\t cot\n"); printf("\t----------------------------------------------\n"); 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 * rad_per_deg); break; case 2: table[i / 10][j] = cos(i * rad_per_deg); break; case 3: // 90°的tan为正无穷 if (i == 90) { table[i / 10][j] = INFINITY; } else { table[i / 10][j] = tan(i * rad_per_deg); } break; case 4: // 0°的cot为正无穷,90°的cot为0 if (i == 0) { table[i / 10][j] = INFINITY; } else if (i == 90) { table[i / 10][j] = 0.0; } else { table[i / 10][j] = 1 / tan(i * rad_per_deg); } break; } } printf("\t%6.0lf\t\t %.4lf\t\t %.4lf\t\t %.4lf\t\t %.4lf\n", table[i / 10][0], table[i / 10][1], table[i / 10][2], table[i / 10][3], table[i / 10][4]); } return 0; }
运行效果说明
- 所有非边界角度的三角函数值计算精度由双精度PI保证,误差在浮点允许范围内
- 90°的tan列会正常输出无穷大标识,不会出现异常极大值
- 0°的cot列会正常输出无穷大,90°的cot列输出0,完全符合数学定义
内容的提问来源于stack exchange,提问作者berry.11
相关产品推荐
相关产品推荐

