LINUX.ORG.RU

История изменений

Исправление grem, (текущая версия) :

Как?

Примерно как ты написал:

 float mycos(const float x) {
    float _sin = mysin(x);
    return sqrt(1-_sin*_sin);
}

Только здесь:

  • не учитывается изменение знака косинуса, но для его учёта придётся if'ов понапихать и не факт, что тогда прямое вычисление будет медленее;
  • повторно вычисляется уже вычисленное значение синуса, вместо подстановки уже вычисленного ранее (одна и та же величина высчитывается два раза вместо одного) - проще уж тогда сразу напрямую косинус посчитать, а не через тригонометрическую формулу;
  • формула для синуса через используемое разложение (x - x3/6 + x3*x*x/120 - x3*x3*x/5040) всё равно неверна для используемых значений x: подставь x=4 и узри, что значение синуса внезапно больше 1 по модулю и при дальнейшем увеличении x продолжает очень быстро расти.

Исходная версия grem, :

Как?

Примерно как ты написал:

 float mycos(const float x) {
    float _sin = mysin(x);
    return sqrt(1-_sin*_sin);
}

Только здесь:

  • не учитывается изменение знака косинуса, но для его учёта придётся if'ов понапихать и не факт, что тогда прямое вычисление будет медленее;
  • повторно вычисляется уже вычисленное значение синуса, вместо подстановки уже вычисленного ранее - проще уж тогда сразу напрямую косинус посчитать, а не через тригонометрическую формулу;
  • формула для синуса через используемое разложение (x - x3/6 + x3*x*x/120 - x3*x3*x/5040) всё равно неверна для используемых значений x: подставь x=4 и узри, что значение синуса внезапно больше 1 по модулю и при дальнейшем увеличении x продолжает очень быстро расти.