Научная нотация - это распространенный способ выражения числа с явным порядком величины. Сначала отличная от нуля цифра, затем точка счисления, затем дробная часть и показатель экспоненты. В двоичном формате существует только одна возможная ненулевая цифра.Почему frexp() не дает научной нотации?
Математика с плавающей запятой включает в себя неявную первую цифру, равную единице, а затем бит мантиссы «следует за точкой счисления».
Так почему же frexp()
положил точку радиуса влево от неявного бита и вернул номер в [0,5, 1] вместо ноу-хау [1, 2]? Есть ли переполнение, чтобы остерегаться?
Фактически он вычитает еще одно значение смещения, указанное в IEEE 754/ISO 60559. В аппаратном обеспечении это потенциально торгует добавление для XOR. В одиночку это кажется довольно слабым аргументом, учитывая, что во многих случаях возврат к нормальному требованию потребует другой операции с плавающей запятой.
Я думаю, что этот вопрос можно упростить: в традиционной текстовой книге для обозначения числа оснований * b * значимое выбирается в диапазоне [1, * b *). Но 'frexp' использует соглашение, чтобы поместить значение в диапазон [1/* b *, 1). Какой из них прав? Какая из них лучше? Я думаю, что это немного похоже на вопрос, должны ли индексы диапазона начинаться с нуля или в одном. –
@KerrekSB На самом деле, я просто сейчас реализую библиотеку логарифмов, а 'frexp' is * not * подходит для этого. Неотъемлемой частью логарифма является то, что было бы возвращено для соглашения [1, 2]. На мой вопрос можно ответить на примеры применимости [1/b, 1], но на самом деле мне интересно, почему «frexp» был спроектирован таким образом, кем бы он ни был изначально разработан. – Potatoswatter
Вы правы - на самом деле '[1, b)' является просто экспонентой диапазона '[0, 1)', о чем мы уже говорили [правильный путь для обозначения диапазонов] (http: // stackoverflow .com/д/9963401/596781). –