2016-09-20 2 views
0

Когда я пытаюсь создать инкрементный список от a до b (так что-то вроде [1,1,1,1,2,1,3, ..., 2] (a = 1, b = 2), то I начать иметь проблему с определенным кодом я придумал:.Создание инкрементного списка

def Range(a,b,r): 
    lst1=[] 
    y=a 
    while y<b: 
     lst1.append(round(float(y+10**-r),r)) 
     y+=10**-r 
    return lst1 

print Range(1,2,3) 

Здесь r сила моих приращений (10**-r) Для r=1 или r=2 код работает отлично и заканчивается на [..., 2,0]. Но для r=3 или r=4 он заканчивается на [..., 2.001] и [..., 2.0001] соответственно. Но тогда для r=5 и r=6 он возвращается к завершению на 2. Есть ли так неправильно с моим кодом или это какая-то ошибка?

+1

Просто прочитайте http://floating-point-gui.de/. –

+0

Это другое. Я получаю целый дополнительный элемент в моем списке, который идет вразрез с логикой этого списка (например, чтобы получить элемент 2.001, утерянный должен принять y = 2.000, но логика в нем - это y <2.000). Плюс я обошел цифры. –

ответ

2

сказать, чтобы получить элемент 2.001, потерянная должен принимать в у = 2.000

Это не так; возможно, что y станет, скажем, 1.99999999999997.

Вы делаете ставку y < b, но затем добавьте round(float(y+10**-r),r). Конечно, возможно, что первое верно, но второе по-прежнему больше b.

Чтобы увидеть, что происходит, удалите округление и посмотрите на следующее-последнее число в своих списках в тех случаях, когда оно происходит «неправильно».

+1

Ahhh. Вы умный человек. Умный, умный человек. Спасибо Большое. Я бы дал вам кекс, но, к сожалению, сейчас я не в вашем районе. –

Смежные вопросы