Какие функции/методы логарифмирования доступны в target-c/coco-touch?

Я пробовал искать логарифм + цель-с, но все, что я получаю, это страницы с тестами по математике от учителей или объяснения, что такое логарифм;)

У меня есть некоторые измерения, например, 83912,41234, а другие — 32,94232. Мне нужно сжать этот огромный спектр в нечто от 0 до 100, и что 32,94232 должно быть по крайней мере чем-то большим, чем 2, где 83912,41234 будет чем-то около 100. Так что я думаю, что функция логарифмирования будет здесь моим другом.

ОБНОВЛЕНИЕ: я наткнулся на файл math.h через «Быстро открыть» (очень хорошая команда в Xcode: SHIFT + CMD + D), и там большой сюрприз:

extern double log ( double );
extern float logf ( float );

extern double log10 ( double );
extern float log10f ( float );

extern double log2 ( double );
extern float log2f ( float );

extern double log1p ( double );
extern float log1pf ( float );

extern double logb ( double );
extern float logbf ( float );

Но: Ни текста, ни комментариев. Я не такой уж помешан на математике. Так что было бы неплохо какое-то описание, например, какой логарифм для какого случая, как выглядит кривая и т. д., поэтому любые отличные ссылки очень ценятся!


person Thanks    schedule 21.05.2009    source источник
comment
Вы хотите, чтобы результаты были на кривой или на прямой линии?   -  person Abizern    schedule 21.05.2009
comment
Я должен попробовать это, но на данный момент я думаю, что это кривая. log2() кажется хорошим, но также кажется, что это очень дорогое вычисление.   -  person Thanks    schedule 21.05.2009
comment
кажется, что производительность резко снижается, когда я использую log2(). Но нельзя быть на 100% уверенным, что это ошибка log2(). Хотя очень похоже, потому что, когда я его не использую и просто делаю x * 0,00412 + 2, производительность кажется лучше.   -  person Thanks    schedule 21.05.2009
comment
Мерить, мерить, мерить. Ue Shark или Instruments расскажут вам, что происходит на самом деле.   -  person Mike Abdullah    schedule 21.05.2009
comment
кроме того, любая версия журнала, которую вы используете, вы получите сопоставимые результаты, поскольку они являются монотонными функциями.   -  person nlucaroni    schedule 20.10.2009
comment
@Спасибо: Просто интересно, что означает x*00412+2 в качестве замены для log2(). Только что проверил и math.log(61440, 2) == 15.906890595608518 и ваш вариант 61440 * 0.00412 + 2 == 255.13280000000003. Как это альтернатива?   -  person ruralcoder    schedule 25.08.2013


Ответы (3)


Кроме того, получение логарифма с произвольным основанием:

float logx(float value, float base) 
{
   return log10f(value) / log10f(base);
}
person Adam Wiggins    schedule 20.10.2009

math.h является стандартным включением. на странице Википедии есть некоторая документация.

Еще один способ «сжать» значения — подогнать их под прямую линию. Для вас пример:

Уравнение прямой линии

y = mx + c
y = 'squished' value.
x = The value you want to squish
m = Gradient of the line
c = intercept on the y axis

Быстрый расчет ваших значений дает что-то вроде:

y = 1.17e-3 x + 1.96

Надеюсь это поможет.

person Abizern    schedule 21.05.2009

Как насчет того, чтобы взять книгу о функциях стандартной библиотеки C?

В противном случае вы можете попробовать справочные страницы: man 3 logf, например

person alamar    schedule 21.05.2009