c - 三角参数归约(归约模 2π)
问题描述
我正在尝试创建一个在技术上仅在 0-pi/2 范围内运行的正弦和余弦计算器。现在这可能看起来很傻,但稍后会使用它,所以我可以使用泰勒级数。
我有一个主要工作的实现,但是当 theta 采用 x * (pi/2) 的形式时,我遇到了一个严重的问题,其中 x 是任意整数。似乎在这些值上,有时它们会被推入它们不属于的附近象限。还有一些我无法解释的偶尔的彻底错误。
我怎样才能支持这一点,使其更有效和正确?
这是执行此操作的代码。
#define T_PI (2.0 * M_PI)
#define H_PI (0.5 * M_PI)
void sincos(float theta, float* cosine, float* cosine) {
int mode;
prepareForRange(&theta, cosine, sine);
Assert(!(f < 0.0 || f > H_PI));
*cosine = cos(theta);
*sine = sin(theta);
range_output(mode, cosine, sine);
}
void prepareForRange(float* theta, int* mode, float *cosine, float* sine) {
if (*theta < 0.0) *theta += ceil(-*theta / T_PI) * T_PI;
*mode = (int)floor(*theta / H_PI) % 4 + 1;
*theta = fmodf(*theta, H_PI);
}
void range_output(int mode, float *cos, float *sin) {
float temp;
switch (mode) {
case 1:
break;
case 2:
temp = *cos;
*cos = -*sin;
*sin = temp;
break;
case 3:
*cos = -*cos;
*sin = -*sin;
break;
case 4:
temp = *cos;
*cos = *sin;
*sin = -temp;
break;
default:
break;
}
}
解决方案
推荐阅读
- python - Sagemaker:如何在 Predictor(Sagemake > 2.0)中设置 content_type?
- azure-devops - 虚拟机可以成为不同项目中定义的多个环境的一部分吗?
- java - 如何从对象列表中删除重复元素
- javascript - 逐行读取区域文件时如何设置上限让读取更灵活?
- laravel - Laravel ManyToMany 关系正在反转表名
- apache-kafka - Avro 是否应该用于 Kafka 中的键和值?
- python - 为调试模式设计打印功能
- c# - 用 C# 计算某些单词在文本中出现的次数
- spring-boot - ActiveMQ Artemis 和 Spring JmsTemplate 的性能问题
- css - Material UI - 全球主题的多个 css 类