Почему экспоненциальная запись с десятичными значениями терпит неудачу?
Условно 1e3
средства 10**3
,
>>> 1e3
1000.0
>>> 10**3
1000
Подобный случай exp(3)
по сравнению с e**3
,
>>> exp(3)
20.085536923187668
>>> e**3
20.085536923187664
Однако теперь обратите внимание, является ли показатель степени float
значение:
>>> exp(3.1)
22.197951281441636
>>> e**3.1
22.197951281441632
что хорошо Теперь для первого примера:
>>> 1e3.1
File "<stdin>", line 1
1e3.1
^
SyntaxError: invalid syntax
>>> 10**3.1
1258.9254117941675
который показывает Python
не любит 1e3.1
, Fortran
тоже. Независимо от того, что это может быть стандартом (!), Почему это так?
3 ответа
Запись с e
является числовым литералом, частью лексического синтаксиса многих языков программирования, основанном на стандартной форме / научной нотации.
Цель этой нотации - дать вам возможность указывать очень большие / маленькие числа, сдвигая положение точки. Он не предназначен для того, чтобы позволить вам кодировать умножение на произвольную степень 10 в числовые литералы. Следовательно, эта точка и следующие цифры даже не распознаются как часть числового литерального токена.
Если вам нужны произвольные полномочия, как вы обнаружили, есть математические функции и операторы, которые делают эту работу. В отличие от числового литерала, вы даже можете определить значения параметров во время выполнения.
Из документов:
sign ::= '+' | '-'
digit ::= '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
indicator ::= 'e' | 'E'
digits ::= digit [digit]...
decimal-part ::= digits '.' [digits] | ['.'] digits
exponent-part ::= indicator [sign] digits #no dots allowed here
Похоже, вы связываете синтаксис литералов с операторами. Хотя вы можете утверждать, что 1e3.1 следует вашему "соглашению", должно быть совершенно ясно, что 1e3.1 не является допустимым литеральным выражением для интерпретатора Python. Язык имеет определенную стандартную грамматику, и этот грамматик не поддерживает литеральные выражения с плавающей запятой как "экспоненты" для своих числовых литералов.
"E" в числовом литерале Python не является оператором (больше, чем десятичная точка). Так что ваше ожидание, что буквальный синтаксис Python должен поддерживать некое "соглашение"... основанное на некоем предопределенном вами шаблоне... не особенно разумно.