Вычисление логарифма без математики

Я пытаюсь вычислить ln(x) по серии Тейлора. Вот мой код:

#define N 10

float ln(float x){ 
    int i;
    float result;
    float xt; 
    float xtpow;
    int sign;
    if(x > 0 && x <= 1){ 
        xt = x - 1.0;
        sign = -1; 
        xtpow = 1.0;
        result = 0;
        for(i = 1 ; i < N + 1; i++ );
        {   
            // Problem here
            printf("%d\n", i); 
            sign = sign * (-1);
            xtpow *= xt; 
            result += xtpow * sign / i;
        }   
    }else if(x >= 1)
    {   
        return -1 * ln(1.0 / x); 
    }   
    return result; 
}

Проблема в моем цикле серий (см. Выше). Кажется, после 1 цикла переменная i становится равным N + 1и ничего не происходит после этого. У вас есть идеи, почему это так?

1 ответ

Решение

Похоже после 1 переменная цикла i становится равным N + 1

Удалить ; цикл после:

for(i = 1 ; i < N + 1; i++ );
                            ^

Ваш цикл продолжает выполняться без выполнения кода в блоке, который вы поместили в фигурные скобки { } после цикла for и for просто увеличивается i до для разрывов петли. После блока кода цикла (где вы прокомментировали "проблема здесь") get выполняется с i = N + 1 значение.

Я не уверен, но у меня есть дополнительные сомнения по поводу условных выражений в if(), Вы код шаблона что-то вроде:

 if(x > 0 && x <= 1){ <-- "True for x == 1"
   // loop code
 }
 else if(x >= 1){ <-- "True for x == 1"  
      // expression code here 
 }

Таким образом, для x == 1 код else никогда не выполняется. Проверьте этот код тоже.

Другие вопросы по тегам