2014-07-24 4 views
7

Научная нотация - это распространенный способ выражения числа с явным порядком величины. Сначала отличная от нуля цифра, затем точка счисления, затем дробная часть и показатель экспоненты. В двоичном формате существует только одна возможная ненулевая цифра.Почему frexp() не дает научной нотации?

Математика с плавающей запятой включает в себя неявную первую цифру, равную единице, а затем бит мантиссы «следует за точкой счисления».

Так почему же frexp() положил точку радиуса влево от неявного бита и вернул номер в [0,5, 1] ​​вместо ноу-хау [1, 2]? Есть ли переполнение, чтобы остерегаться?

Фактически он вычитает еще одно значение смещения, указанное в IEEE 754/ISO 60559. В аппаратном обеспечении это потенциально торгует добавление для XOR. В одиночку это кажется довольно слабым аргументом, учитывая, что во многих случаях возврат к нормальному требованию потребует другой операции с плавающей запятой.

+1

Я думаю, что этот вопрос можно упростить: в традиционной текстовой книге для обозначения числа оснований * b * значимое выбирается в диапазоне [1, * b *). Но 'frexp' использует соглашение, чтобы поместить значение в диапазон [1/* b *, 1). Какой из них прав? Какая из них лучше? Я думаю, что это немного похоже на вопрос, должны ли индексы диапазона начинаться с нуля или в одном. –

+0

@KerrekSB На самом деле, я просто сейчас реализую библиотеку логарифмов, а 'frexp' is * not * подходит для этого. Неотъемлемой частью логарифма является то, что было бы возвращено для соглашения [1, 2]. На мой вопрос можно ответить на примеры применимости [1/b, 1], но на самом деле мне интересно, почему «frexp» был спроектирован таким образом, кем бы он ни был изначально разработан. – Potatoswatter

+0

Вы правы - на самом деле '[1, b)' является просто экспонентой диапазона '[0, 1)', о чем мы уже говорили [правильный путь для обозначения диапазонов] (http: // stackoverflow .com/д/9963401/596781). –

ответ

10

rationale говорит:

4.5.4.2 frexp функция

Функции frexp, ldexp и MODF примитивы, используемые остальной части библиотеки. Было высказано мнение о том, что они сбросили их по тем же причинам, что и ecvt, fcvt и gcvt, но их сторонники спасли их для общего использования. Их использование проблематично: на недвоичные архитектуры ldexp могут потерять точность, а frexp может быть неэффективен.

Можно предположить, что «остальная часть библиотеки» было удобнее писать конвенции frexp «s, или уже традиционно написаны против этого интерфейса, хотя он не обеспечивает никакой пользы.

Я знаю, что это не полностью отвечает на вопрос, но это не совсем вписывается в комментарий.

Я хотел бы также отметить, что некоторые из выборов, сделанных в конструкции языка C предшествуют IEEE 754. Возможно, формат возвращаемого frexp смысла с форматом на PDP-11-й с плавающей точкой (ами) или любая другая архитектура, на которой впервые была введена функция frexp. EDIT: см. Также страницу 155 из manual для одной модели PDP-11.

+1

Спасибо, это, безусловно, больше, чем комментарий! Не удивительно, что его генезис был UNIX, но интересно, что кто-то однажды попытался убить его. – Potatoswatter

+3

Да, плавающая точка PDP-11 документирована как имеющая двоичную точку слева от «скрытого» бита ... Итак, для экспоненты == 0 это число равно frexp(), 0.5..0.99999 ... Интересно, что между форматами PDP-11 и IEEE мало различий - по сути, разница - это смещение, применяемое к экспоненте, для IEEE смещение составляет 127 (для одной длины), где для PDP -11 такая же битовая диаграмма (по модулю байтового упорядочения) имеет (эффективно) смещение 129. –

+0

@gmch Это даст отличный ответ. Он пахнет дымящимся пистолетом, даже если мы не можем быть уверены, что нет другой причины. – Potatoswatter

Смежные вопросы