4.7 – Введение в экспоненциальную запись
Прежде чем мы поговорим о нашей следующей теме, пройдемся по теме экспоненциальной записи.
Экспоненциальная запись (научная нотация) – это удобное сокращение для краткого написания длинных чисел. И хотя сначала экспоненциальная запись может показаться чуждой, ее понимание поможет вам понять, как работают числа с плавающей запятой, и, что более важно, каковы их ограничения.
Числа в экспоненциальном представлении имеют следующий вид: мантисса x 10порядок. Например, в экспоненциальном представлении 1,2 x 104, 1,2 – это мантисса, а 4 – порядок (показатель степени). Поскольку 104 означает 10 000, 1,2 x 104 означает 12 000.
По соглашению, числа в экспоненциальном представлении записываются с одной цифрой перед десятичной запятой, а остальные цифры – после нее.
Рассмотрим массу Земли. В десятичной системе счисления мы запишем это как 5973600000000000000000000 кг. Это действительно большое число (слишком большое, чтобы поместиться даже в 8-байтовое целочисленное значение). Его также трудно прочитать (это 19 или 20 нулей?). Даже с разделителями (5 973 600 000 000 000 000 000 000) число всё равно трудно прочитать.
В экспоненциальном представлении оно будет записано как 5,9736 x 1024 кг, что намного легче прочитать. Экспоненциальная запись имеет дополнительное преимущество, поскольку упрощает сравнение двух действительно больших или действительно маленьких чисел, просто сравнивая показатель степени.
Поскольку в C++ может быть сложно ввести или отобразить показатели степени, для обозначения части выражения «умноженное на 10 в степени» мы используем букву 'e' (или иногда 'E'). Например, 1,2 x 104 будет записано как 1.2e4, а 5,9736 x 1024 будет записано как 5.9736e24.
Для чисел меньше 1 показатель степени может быть отрицательным. Число 5e-2 эквивалентно 5 x 10-2, что составляет 5/102 или 0,05. Масса электрона составляет 9.1093822e-31 кг.
Как преобразовывать числа в экспоненциальное представление
Используйте следующую процедуру:
- ваш показатель степени начинается с нуля;
- сдвиньте десятичную запятую так, чтобы слева от нее была только одна ненулевая цифра;
- каждый знак, на который вы сдвигаете десятичную запятую влево, увеличивает показатель степени на 1;
- каждый знак, на который вы сдвигаете десятичную запятую вправо, уменьшает показатель степени на 1;
- обрежьте все ведущие нули (на левом конце мантиссы);
- обрежьте все нули в конце (в правом конце мантиссы), только если исходное число не имело десятичной точки. Мы предполагаем, что они несущественны, если не указано иное.
Вот несколько примеров:
Задано число: 42030
Сдвигаем десятичную запятую влево на 4 знака: 4.2030e4
Начальных нулей для обрезки нет: 4.2030e4
Обрезаем завершающие нули: 4.203e4 (4 значащих цифры)
Задано число: 0,0078900
Сдвигаем десятичную запятую вправо на 3 знака: 0007.8900e-3
Обрезаем ведущие нули: 7.8900e-3
Не обрезаем завершающие нули: 7.8900e-3 (5 значащих цифр)
Задано число: 600,410
Сдвигаем десятичную запятую влево на 2 знака: 6.00410e2
Начальных нулей для обрезки нет: 6.00410e2
Не обрезаем завершающие нули: 6.00410e2 (6 значащих цифр)
Самое важное, что нужно понять: цифры в мантиссе (часть перед "е") называются значащими цифрами. Количество значащих цифр определяет точность числа. Чем больше цифр в мантиссе, тем точнее число.
Точность и конечные нули после десятичной запятой
Рассмотрим случай, когда мы просим двух лаборантов взвесить одно и то же яблоко. Один возвращается и говорит, что яблоко весит 87 грамм. Другой возвращается и говорит, что яблоко весит 87,00 грамм. Предположим, что взвешивание правильное. В первом случае фактический вес яблока может составлять от 86,50 до 87,49 грамма. Может быть, точность весов была 1 грамм. Или, может быть, наш помощник немного округлил. Во втором случае мы в большей степени уверены в фактическом весе яблока (оно весит от 86,9950 до 87,0049 граммов, где значительно меньше вариативности).
Поэтому в стандартной экспоненциальной записи мы предпочитаем оставлять конечные нули после десятичной запятой, потому что эти цифры несут полезную информацию о точности числа.
Однако в C++ 87 и 87.00 обрабатываются одинаково, и компилятор сохранит одно и то же значение для каждого из них. Нет никаких технических причин, по которым мы должны предпочесть одно другому (хотя могут быть научные причины, если вы используете исходный код в качестве документации).
Теперь, когда мы рассмотрели экспоненциальную запись (научную нотацию), мы готовы рассмотреть числа с плавающей запятой.
Небольшой тест
Вопрос 1
Преобразуйте следующие числа в экспоненциальную запись в стиле C++ (используя e для обозначения экспоненты) и определите, сколько значащих цифр каждое имеет число (оставляйте конечные нули после десятичной запятой):
a) 34,50
Ответ
3.450e1 (4 значащих цифры)
b) 0,004000
Ответ
4.000e-3 (4 значащих цифры)
c) 123.005
Ответ
1.23005e2 (6 значащих цифр)
d) 146000
Ответ
1.46000e5 (3 значащих цифры). Помните, что нули в конце целого числа без десятичной запятой не являются значащими, но их можно использовать для документации.
e) 146000.001
Ответ
1.46000001e5 (9 значащих цифр)
f) 0,0000000008
Ответ
8e-10 (1 значащая цифра). Правильная мантисса – 8, а не 8.0. 8.0 имеет две значащие цифры, но в этом числе она только 1.
g) 34500,0
Ответ
3.45000e4 (6 значащих цифр). Мы не обрезаем здесь конечные нули, потому что у числа есть десятичная запятая. Хотя десятичная запятая не влияет на значение числа, она влияет на точность, поэтому ее необходимо включать в мантиссу.