2016-03-13 2 views
1

Я пытаюсь научиться вычислять базу логарифмов 10 любых чисел, которые я вводил через scanf в свой код. Я полагаю, что я мог бы вычислить, что ln (a) a является номером ввода. У меня есть рабочий код, который вычисляет это; однако теперь я просто хочу разделить любые числа, которые выводит код ln (a) на определенный LN10. Это связано с тем, что естественный журнал числа, деленного на естественный лог на 10, выведет мое обязательное значение базы логарифма 10, которое я работаю для достижения. Здесь есть беспорядок, который у меня есть на данный момент. Любая помощь очень ценится!Пытается подсчитать логарифмическую базу 10 без Math.h (действительно близко) Просто возникают проблемы со связанными функциями

#define _CRT_SECURE_NO_WARNINGS 
#define ALMOSTZERO 0.0000000000000000001 
#define LN10 2.3025850929940456840179914546844 

#include <stdio.h> 

double log10(double); 
double ln(double); 

void main() 
{ 
    { 
    double x, a; 
    printf("Enter value: "); 
    scanf("%lf", &x); 
    while (x > 0) 
    { 
     double log10 = ln(x) * LN10; 
     printf("log10(%lf)=%lf\n", x, a); 
     printf("Enter value: "); 
     scanf("%lf", &x); 
    } 
    } 
} 

double ln(double x) 
{ 
    double sum = 0.0; 
    double xmlxpl = (x - 1)/(x + 1); 
    double denom = 1.0; 
    double frac = xmlxpl; 
    double term = frac/denom; 

    while (term > ALMOSTZERO) 
    { 
     sum += term; 
     //generate next term 
     denom += 2.0; 
     frac = frac * xmlxpl * xmlxpl; 
     term = frac/denom; 
    } 
    return 2.0 * sum; 
} 
+0

Что вы хотите сказать? –

ответ

1

Есть некоторые проблемы в вашем коде, но то, что вам нужно вычислить журнал написав функцию для вычисления ¯Ln ряда это просто еще одна простая функция:

#define LN10 2.3025850929940456840179914546844 

double log10(double x) { 
    return ln(x)/LN10;  
} 

Я бы тоже изменил вашу функцию ln, по крайней мере, чтобы остановить итерации, потому что term может стать достаточно маленьким, чтобы sum == sum + term (численно говоря). В вашем фактическом коде вы можете остановиться раньше, проверяя, что abs(term) будет меньше, чем некоторый эпсилон относительно значения sum. Я просто использовал это:

double ln(double x) 
{ 
    double old_sum = 0.0; 
    double xmlxpl = (x - 1)/(x + 1); 
    double xmlxpl_2 = xmlxpl * xmlxpl; 
    double denom = 1.0; 
    double frac = xmlxpl; 
    double term = frac;     // denom start from 1.0 
    double sum = term; 

    while (sum != old_sum) 
    { 
     old_sum = sum; 
     denom += 2.0; 
     frac *= xmlxpl_2; 
     sum += frac/denom; 
    } 
    return 2.0 * sum; 
} 

Это сэкономит вам несколько итераций, дающие тот же (аппроксимировать) результат вашего кода. Чтобы позаботиться о последних терминах, вы должны принять другую цифровую стратегию.

Ваш главный также нуждается в некоторых изменениях. По крайней мере, больше контроля над вводом пользователя:

#include <stdio.h> 

double log10(double); 
double ln(double); 

int main() 
{ 
    double x, a; 
    printf("This program calculates the logarithm base 10.\n"); 

    printf("Enter a positive value: "); 
    while (1 == scanf("%lf", &x) && x > 0.0) 
    { 
     double a = log10(x); 
     printf("log10(%lf) = %.12lf\n", x, a); 
     printf("Enter a positive value: "); 
    } 
    return 0; 
} 
+0

Спасибо за помощь! Он работает именно так, как я пытался его получить. Я действительно новый и неряшливый и действительно не знал, как использовать возврат и как отправить результаты других функций моей основной функции. Таким образом, я оставил легкую небольшую функцию журнала, не понимая, как подключить ее к моей основной функции вместе с моей функцией ln. Еще раз спасибо! будет повышаться, но не имеет достаточно высокого значения rep = ( – tyooo

 Смежные вопросы

  • Нет связанных вопросов^_^