Бесконечность сгенерирована в коде Python

Генераторы и Итераторы (работает только в Firefox 2 + и Safari).

function fib() {
  var i = 0, j = 1;
  while (true) {
    yield i;
    var t = i;
    i = j;
    j += t;
  }
}

var g = fib();
for (var i = 0; i < 10; i++) {
  document.write(g.next() + "
\n"); }

функция, содержащая yield, ключевое слово является генератором. При вызове его его формальные параметры связываются с действительными аргументами, но его тело на самом деле не оценено. Вместо этого итератор генератора возвращается. Каждый вызов к итератору генератора next() метод работает, другой проходит через итеративный алгоритм. Значение каждого шага является значением, определенным yield ключевое слово. Думайте yield как версия итератора генератора возврата, указывая на границу между каждым повторением алгоритма. Каждый раз Вы звоните next(), резюме кода генератора от оператора после yield.

В нормальном использовании, объекты итератора "невидимы"; Вы не должны будете воздействовать на них явно, но будете вместо этого использовать JavaScript for...in и for each...in операторы для цикличного выполнения естественно по ключам и/или значениям объектов.

var objectWithIterator = getObjectSomehow();

for (var i in objectWithIterator)
{
  document.write(objectWithIterator[i] + "
\n"); }

6
задан UsAaR33 1 December 2009 в 08:29
поделиться

1 ответ

Где-то между 1e308 и 1e309 точность с плавающей запятой заканчивается, поэтому, если вы вычисляете результаты выше этого диапазона, вы увидите inf

>>> 1e308
1e+308
>>> 1e309
inf

>>> json.dumps(1e308,allow_nan=False)
'1e+308'
>>> json.dumps(1e309,allow_nan=False)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/json/__init__.py", line 237, in dumps
    **kw).encode(obj)
  File "/usr/lib/python2.6/json/encoder.py", line 367, in encode
    chunks = list(self.iterencode(o))
  File "/usr/lib/python2.6/json/encoder.py", line 304, in _iterencode
    yield floatstr(o, self.allow_nan)
  File "/usr/lib/python2.6/json/encoder.py", line 47, in floatstr
    raise ValueError(msg)
ValueError: Out of range float values are not JSON compliant: inf
>>> 

Decimal может обрабатывать большие числа, но, очевидно, это снижает производительность (и его нельзя сериализовать с помощью json)

>>> from decimal import Decimal
>>> Decimal('1e900')/10
Decimal("1E+899")

Вот пример добавления, которое не вызывает исключение переполнения

>>> a=1e308
>>> a+a
inf
13
ответ дан 8 December 2019 в 18:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: