Преобразование десятичного числа в научной записи в IEEE 754 - PullRequest
3 голосов
/ 15 сентября 2011

Я прочитал несколько текстов и потоков, показывающих, как преобразовать десятичное число в IEEE 754, но я все еще не уверен, как преобразовать число без расширения десятичного числа (которое представлено в научной нотации)

Число, с которым я особенно работаю, - 9.07 * 10^23, но подойдет любое число;Я выясню, как это сделать для моего конкретного примера.

Ответы [ 2 ]

2 голосов
/ 18 сентября 2011

Я предполагаю, что вы хотите, чтобы результат был числом с плавающей запятой, ближайшим к десятичному числу, и что вы используете числа с плавающей запятой двойной точности.

Для большинства чисел существуетспособ сделать это относительно быстро.Вот как это работает вкратце.

Вам нужно разбить число на произведение или на дробь чисел, которые имеют точное представление в виде числа с плавающей запятой.Наибольшая степень 10, которая точно представима, равна 10 ^ 22.Итак, чтобы получить 9,07e + 23 в форме с плавающей запятой, мы можем написать:

9.07e+23 = 907 * 10^21

В соответствии со стандартом IEEE-754 гарантируется, что одна операция с плавающей запятой будет правильно округлена, поэтомуПриведенный выше продукт, вычисленный как произведение двух чисел с плавающей запятой двойной точности, даст правильно округленный результат.

Если бы вы использовали это в функции преобразования, вы, вероятно, сохранили бы значения 10 вмассив.

Обратите внимание, что вы не можете использовать этот метод для 9.07e-23.Это число равно 907/10 ^ 23, поэтому знаменатель будет слишком большим, чтобы его можно было точно представить.В этой ситуации, а также при работе с очень большими или очень маленькими числами, вы должны использовать некоторую форму высокоточной арифметики.

См. Быстрое преобразование десятичного числа в число с плавающей запятой для дальнейшего изучения.подробности и примеры.

1 голос
/ 15 сентября 2011

Преобразование числа из десятичной строки в двоичное IEEE довольно просто, если вы знаете, как выполнять сложение и умножение IEEE с плавающей запятой.(или если вы используете какой-либо базовый язык программирования, например C / C ++)

Существует множество различных подходов к этому, но самый простой - это оценить 9.07 * 10^23 напрямую.

Во-первых,начать с 9.07:

9.07 = 9 + 0 * 10^-1 + 7 * 10^-2

Теперь оцените 10^23.Это можно сделать, начав с 10 и используя любой алгоритм включения.

Затем умножьте результаты вместе.

Вот простая реализация на C / C ++:

double mantissa = 9;
mantissa += 0 / 10.;
mantissa += 7 / 100.;

double exp = 1;
for (int i = 0; i < 23; i++){
    exp *= 10;
}

double result = mantissa * exp;

Теперь вернуться назад (IEEE -> к десятичному) намного сложнее.

Опять же, есть также много разных подходов.Вот самый простой вариант, который я могу себе представить.

Я буду использовать 1.0011101b * 2^40 в качестве примера.(мантисса в двоичном виде)

Сначала преобразуйте мантиссу в десятичную: (это должно быть легко, поскольку показателя нет)

1.0011101b * 2^40 = 1.22656 * 2^40

Теперь "масштабируйте" число так, чтобыдвоичный показатель исчезает.Это делается путем умножения на соответствующую степень 10, чтобы «избавиться» от двоичного показателя.

1.22656 * 2^40 = 1.22656 * (2^40 * 10^-12) * 10^12
               = 1.22656 * (1.09951) * 10^12
               = 1.34861 * 10^12

Таким образом, ответ:

1.0011101b * 2^40 = 1.34861 * 10^12

В этом примере 10^12 было необходимо, чтобы «уменьшить масштаб» 2^40.Определение необходимой мощности 10 просто равно:

power of 10 = (power of 2) * log(2)/log(10)
...