LINUX.ORG.RU

C log2 алгоритм

 ,


0

1

Если в java посчитать log2 от 7 = 3, если в гугле посчитать получается 2.80735492206, тоже примерно три.

Перебрал кучу алгоритмов расчета log2 в Си, все упорно выдают 2-ку.

В java я его считаю так:


int l2 = (int)Math.round( log2( 7 ));

public static double log2( long number) {
	return Math.log( number ) / Math.log( 2.0 );
}

barberry ★★
() автор топика

Ты наркоман? Как ты делаешь на си? Вот специально для тебя сейчас залез и написал: получилось дробное число.

Или ты хочешь, чтобы после округления у тебя получилось три?

HerrWeigel ★★★★
()
Последнее исправление: HerrWeigel (всего исправлений: 1)

если double 2.8 привести к int получится 2, т.к. при приведении не происходит округления, а отбрасывается дробная часть.
Для округления есть функция round:

double log2(double n) {  
    return log(n) / log(2);  
}

double result = log2(7); // result = 2.8...
int result2 = log2(7); // result = 2;
int result3 = round(log2(7)); // result3 = 3;

elijah_sd
()

В Си, при приведении к int числа с плавающей точкой, делается не округление, а просто отбрасывается дробная часть.

int i = 1.99f даст 1.

Stahl ★★☆
()

Короче, надеюсь, тебе нужна функция ceil. Ну, или round, да.

HerrWeigel ★★★★
()
Последнее исправление: HerrWeigel (всего исправлений: 1)
Ответ на: комментарий от Stahl

Это то и так понятно, что отбрасывает. Просто все алгоритмы что я видел в интернете, был на int. Вариант, от elijah_sd очень похож на правду.

barberry ★★
() автор топика
Ответ на: комментарий от barberry

Должно быть, ошибка линковки

Собираешь с -lm?

anonymous
()

Нашел почему не находил log, для ликера надо было добавить опцию -lm.

barberry ★★
() автор топика

Все спасибо, все заработало.

barberry ★★
() автор топика

man floor, man ceil, man round

IvanR ★★★
()
Ответ на: комментарий от mix_mix

А во фре fls, как википедия говорит. В ляликсе есть или нет не знаю

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.