Редактировать 3: Надеюсь, это будет мое последнее редактирование. Я пришел к выводу, что я вообще должным образом не ответил на этот вопрос. Я собираюсь оставить свой ответ на месте как предостерегающий рассказ, и потому что он может иметь некоторую образовательную ценность. Но я понимаю, почему у меня нет нулевых голосов, и на самом деле я собираюсь поднять ответ Энди Росса, потому что я думаю, что он гораздо более актуален (хотя и неполен, по крайней мере, на момент написания). Мне кажется, моя ошибка заключалась в том, чтобы воспринимать определения Man, которые я нашел для ilogbf (), немного поверхностно. Это функция, которая принимает целую часть лога с плавающей точкой, насколько сложно это реализовать? Оказывается, что функция на самом деле представляет собой представление IEEE с плавающей запятой, в частности, экспонентную (в отличие от мантиссы) часть этого представления. Я должен был определенно понять это, прежде чем пытаться ответить на вопрос! Для меня интересным является то, как функция может найти экспонентную часть числа с плавающей точкой, так как я думал, что фундаментальное правило C состоит в том, что числа с плавающей точкой повышаются до удваивающихся значений как часть вызова функции. Но это, конечно, отдельная дискуссия.
--- Конец редактирования 3, начало поучительной истории ---
Небольшое прибегание к гуглу предполагает, что они определены в некоторых разновидностях Unix, но, возможно, не соответствуют ни одному из стандартов Posix или ANSI и поэтому не предоставляются библиотеками MSVC. Если функции не находятся в библиотеке, они не будут объявлены в math.h. Очевидно, что если компилятор не может видеть объявления для этих внешних символов, он не будет счастлив, и вы получите ошибки, подобные тем, которые вы перечислили.
Очевидный обходной путь заключается в создании собственных версий этих функций с использованием математических функций, которые предусмотрены . например,
#include <math.h>
int ilogbf( float f )
{
double d1 = (double)f;
double d2 = log(d1);
int ret = (int)d2;
return ret;
}
Редактировать: Это не совсем правильно. По-видимому, эта функция должна использовать log для base 2, а не натуральные log, так что возвращаемое значение фактически является двоичным показателем. Он также должен принимать абсолютное значение своего параметра, чтобы он работал и для отрицательных чисел. Я поработаю над улучшенной версией, если вы спросите меня в комментарии, в противном случае мне хочется оставить это в качестве упражнения для читателя: -)
Суть моего ответа, то есть, что ANSI C не требует этой функции и что MSVC не включает ее, по-видимому, правильна.
Редактировать 2: Хорошо, я ослаблен и предоставил улучшенную версию без запроса. Вот оно;
#include <math.h>
int ilogbf( float f )
{
double d1 = (double)f;
if( d1 < 0 )
d1 = -d1;
double d2 = log(d1) / log(2); // log2(x) = ln(x)/ln(2)
int ret = (int)d2;
return ret;
}