Как объявить математические функции IEEE, такие как «ilogbf», в MSVC++6?

StackOverflow https://stackoverflow.com/questions/1726890

  •  19-09-2019
  •  | 
  •  

Вопрос

Может ли кто-нибудь помочь мне и рассказать, как включить математические функции IEEE в MSVC++6?Я попробовал оба и , но все равно получаю эти ошибки:

ошибка C2065:'ilogbf':необъявленный идентификатор

ошибка C2065:'скальбнф':необъявленный идентификатор

Это было полезно?

Решение

Редактировать 3:Надеюсь, это будет моя последняя обработка.Я пришел к выводу, что вообще не затронул этот вопрос должным образом.Я оставлю свой ответ на месте в качестве предостережения и потому, что он может иметь некоторую образовательную ценность.Но я понимаю, почему у меня ноль голосов «за», и на самом деле я собираюсь проголосовать за ответ Энди Росса, потому что считаю его гораздо более актуальным (хотя и неполным, по крайней мере, на момент написания).Мне кажется, моя ошибка заключалась в том, что я несколько поверхностно воспринял определения Man, которые я нашел для ilogbf().Это функция, которая принимает целую часть журнала числа с плавающей запятой. Насколько сложно это реализовать?Оказывается, на самом деле эта функция представляет собой представление IEEE с плавающей запятой, в частности экспоненту (в отличие от мантиссы) этого представления.Я определенно должен был это понять, прежде чем пытаться ответить на вопрос!Для меня интересным моментом является то, как функция может найти показатель степени числа с плавающей запятой, поскольку я думал, что фундаментальное правило C заключается в том, что числа с плавающей запятой преобразуются в двойные значения как часть вызова функции.Но это, конечно, отдельный разговор.

--- Конец редактирования 3, начало предостережения ---

Небольшой поиск в Google показывает, что они определены в некоторых вариантах 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;
}

Редактировать:Это не совсем правильно.По-видимому, эта функция должна использовать журнал по основанию 2, а не натуральные журналы, чтобы возвращаемое значение на самом деле было двоичным показателем.Он также должен принимать абсолютное значение своего параметра, чтобы он работал и для отрицательных чисел.Я разработаю улучшенную версию, если вы спросите меня в комментариях, иначе у меня возникнет соблазн оставить это в качестве упражнения для читателя :-)

Суть моего ответа, т.е.то, что 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;
}

Другие советы

Это функции C99, а не IEEE754-1985.Похоже, Microsoft решила, что их рынок не заботится о поддержке C99, поэтому они не удосужились ее предоставить.Это позор, но если больше из вас (разработчиков) не будут жаловаться, нет причин ожидать, что ситуация изменится.

Совершенно новый стандарт 754, IEEE754-2008, требует этих функций (раздел 5.3.3, «Операции logBFormat»), но эта версия стандарта не получит широкого распространения еще несколько лет;даже если он получит широкое распространение, Microsoft не сочла целесообразным предоставлять эти функции в течение десяти лет, пока они находились в C99, так зачем им предоставлять их только потому, что они соответствуют стандарту IEEE754?

редактировать: обратите внимание, что scalb и logb определены в IEEE754-1985. Приложение «Рекомендуемые функции и предикаты», но указанное приложение явно «не является частью» указанного стандарта.

Если вы знаете, что используете систему IEEE (а в наши дни это так), эти функции не нужны:просто проверьте биты напрямую, объединив двойное число с uint64_t.Предположительно, вы используете эти функции в первую очередь в интересах эффективности (в противном случае вы бы использовали более естественные операции, такие как log() или exp()), поэтому, вероятно, стоит потратить немного усилий на сопоставление вашего кода с представлением с плавающей запятой.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top