Почему экспоненциальная запись с десятичными значениями терпит неудачу?

Условно 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 должен поддерживать некое "соглашение"... основанное на некоем предопределенном вами шаблоне... не особенно разумно.

Другие вопросы по тегам