Редактировать: Изменен код, чтобы избежать переполнения exp (). Это привело к значительному сокращению разрыва между двумя функциями. Спасибо, Фредрик.
Код:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, char **argv)
{
if (argc != 3) {
return 0;
}
int type = atoi(argv[1]);
int count = atoi(argv[2]);
double (*func)(double) = type == 1 ? exp : log;
int i;
for (i = 0; i < count; i++) {
func(i%100);
}
return 0;
}
(скомпилировать с помощью:)
emil@lanfear /home/emil/dev $ gcc -o test_log test_log.c -lm
Результаты кажутся довольно убедительными:
emil@lanfear /home/emil/dev $ time ./test_log 0 10000000
real 0m2.307s
user 0m2.040s
sys 0m0.000s
emil@lanfear /home/emil/dev $ time ./test_log 1 10000000
real 0m2.639s
user 0m2.632s
sys 0m0.004s
Немного удивительно, что журнал кажется более быстрым.
Чистая спекуляция:
Возможно, лежащий в основе математический ряд Тейлора сходится быстрее для логарифма или чего-то еще? Мне действительно кажется, что натуральный логарифм легче вычислить, чем показательная функция :
ln(1+x) = x - x^2/2 + x^3/3 ...
e^x = 1 + x + x^2/2! + x^3/3! + x^4/4! ...
Однако не уверен, что библиотека c работает так же. Но это не кажется невероятным.