4.7 – Введение в экспоненциальную запись

Добавлено 1 мая 2021 в 10:39

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

Экспоненциальная запись (научная нотация) – это удобное сокращение для краткого написания длинных чисел. И хотя сначала экспоненциальная запись может показаться чуждой, ее понимание поможет вам понять, как работают числа с плавающей запятой, и, что более важно, каковы их ограничения.

Числа в экспоненциальном представлении имеют следующий вид: мантисса 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 значащих цифр). Мы не обрезаем здесь конечные нули, потому что у числа есть десятичная запятая. Хотя десятичная запятая не влияет на значение числа, она влияет на точность, поэтому ее необходимо включать в мантиссу.

Теги

C++ / CppLearnCppДля начинающихОбучениеПрограммированиеЭкспоненциальная запись

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.