Я видел функцию double frexp (double x, int* exp);
, которая разбивает двойное на мантиссою (m) и показатель степени (e) с мощностью 2 (1.m * 2^e
). Есть ли аналогичная функция, которая возвращает значение в степени 10? Что-то вроде m * 10^e
было бы идеально.Как получить мантиссою и экспоненту двойника силой 10?
ответ
Дело в том, что если вы используете двоичную с плавающей запятой IEEE 754 (или PDP-11 floating-point), она просто отображает представление значения с плавающей запятой. Таким образом, разложение является точным, и оно является биективным: вы можете восстановить аргумент из значащего и экспоненты, которые вы получили.
Не существует эквивалентной причины для выделения функции декомпозиции с мощностью десяти. Фактически, определение такой функции создавало бы ряд технических препятствий: не все полномочия десяти представлены точно как double
: 0,1 и 10 aren't. Для элемента base-ten-importantand вам нужно значение, которое приближается к аргументу при умножении на 10 e или на приближение с двойной точностью 10 e? Некоторые значения с плавающей запятой могут иметь несколько одинаково допустимых разложений. Некоторые значения с плавающей запятой могут не иметь разложения.
Если эти точности и каноничность аспекты не имеют значения для вас, используйте e = floor(log10(abs(x)))
для базовых 10-экспонентов (или ceil
для конвенции больше похож на PDP-11-стиль frexp
) и x/pow(10, e)
для базы-10- мантисса. Если для вас важно, чтобы значение составляло от 1 до 10, вам нужно было усилить это свойство, зажав его.
ПРИМЕЧАНИЕ: Если то, что вы хотите конвертировать x
в десятичную, проблема была studied in depth. Первым шагом правильного округленного преобразования в десятичное значение является , а не, чтобы вычислить значение base-ten как число с плавающей запятой (не во всех случаях, так как для некоторых входов это может быть приемлемым ярлыком), поскольку в общем случае, на этом этапе будут введены аппроксимации, которые недопустимы для корректно округленной функции преобразования. Для быстрого и грязного преобразования в десятичную процедуру (в случае, если у вас есть доступ к log10
, но не до sprintf
), этого может быть достаточно.
http://stackoverflow.com/questions/15685181/how-to-get-the-sign-mantissa-and-exponent-of-a-floating-point-number –