当前位置: 首页 > 知识库问答 >
问题:

三角变元约简(约简模2π)

彭烨烁
2023-03-14

我试图创建一个正弦和余弦的计算器,技术上只在0-pi/2的范围内运行。现在这可能看起来很傻,但以后它将被使用,这样我就可以使用泰勒级数。

我有一个大部分工作的实现,但是当θ是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;
    }
}

共有1个答案

班安平
2023-03-14

您正遇到一个长期存在且经常无法识别的问题领域,称为范围缩减。基本问题是,浮点PI常数的精度只有8位数,所以当你试图计算(x-n*PI)n~10^4时,你的结果中损失了一半的精度,而且随着n变大,情况会变得更糟。这个问题没有简单的软件解决方案。为了在我自己的数值库中真正解决这个问题,我必须有效地实现任意精度浮点算术,并存储一个320位(1078位)的PI常数。libc的一些实现有效地为您实现了这一点,但不是所有的实现,所以您不能放心地假设它。

 类似资料:
  • 我已经实现了三角函数(sin,cos,arctan)的一些近似值,用单精度(32位浮点)计算,它们的精度约为+/-2ULP。 我的目标设备不支持任何或方法。它不提供FMA,而是提供MAC ALU。ALU和LU以32位格式计算。 我现在的目标是为正弦和余弦提供更大的输入范围(尽可能大,理想情况下是[FLT_MIN,flt_max]),这导致我减少参数。 我目前正在阅读不同的论文,比如K.C.Ng写的

  • 关于元组,上一讲中涉及到了这个名词。本讲完整地讲述它。 先看一个例子: >>>#变量引用str >>> s = "abc" >>> s 'abc' >>>#如果这样写,就会是... >>> t = 123,'abc',["come","here"] >>> t (123, 'abc', ['come', 'here']) 上面例子中看到的变量t,并没有报错,也没有“最后一个有效”,而是将对象做

  • 开发人员可以选择三种语言来编写智能合约: 1.solidity,以太坊的旗舰语言,也是开发智能合约最流行的语言。 2.Serpent,一个用于编写智能合约的Python语言。 3.类LISP语言(LLL),低级语言,Serpent提供了LLL的超集。使用LLL的信息不多,这个博客/var/log/syrinx和github相关的库lll-resurrected GitHub不错,可以参考参考。 为

  • 1.【强制】不要使用count(列名)或count(常量)来替代count(),count()就是SQL92定义的标准统计行数的语法,跟数据库无关,跟NULL和非NULL无关。 说明:count(*)会统计值为NULL的行,而count(列名)不会统计此列为NULL值的行。 2.【强制】count(distinct col)计算该列除NULL之外的不重复数量。注意 count(distinctco

  • 我有一个对象列表,如下所示: 在<范围内,每天都有一个元素。 我希望能够根据和之间的间隔将这些元素减少到不同的时态分组中。如果和之间的差异大于4年,我希望将它们分组为年。如果差异小于四年,但大于一年,我想把它们分成几个月。如果小于一年,但大于一个月,我想分成几周。任何少于一个月的,不需要分组。 当我说“group”时,我的意思是我想总结属于特定年份的所有东西的元素(使用上面的第一个示例),并为每个

  • 出自何乐源码,简单的易语言写的markdown编辑器,Markdown NOTEPAD pro使用了著名的开源项目Editor.md,感谢Editor.md的作者,本程序使用了一些来自互联网的免费,开源作品及其资源,其版权归其作者所有。本软件是一个免费软件,感谢大家的支持和使用。软件UI设计主要配色是白黑,突出简约的风格,给使用者更美观的感觉,欢迎fork/star。 版本:Editor.md v