pętla for a krok

pętla for a krok
EV
  • Rejestracja:około 10 lat
  • Ostatnio:ponad 8 lat
  • Postów:25
0

Cześć,
chcę zrobić pętlę for w przedziale (-1,1) z krokiem co 0.1, ale range przyjmuje tylko inty, po zaokrągleniu mam krok co 0...
zwiekszając argument x=x+0.1 nie działa niestety. ktoś ma jakiś pomysł?
przepraszam za trywialne pytania, jestem poczatkujacy.

Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0

Krok co 0.1 się nie sprawdzi do końca tak jak myślisz z powodu niedokładności liczb zmiennoprzecinkowych.
Nie będzie Ci lepiej po prostu dzielić przez 10?


SI
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 2 godziny
0

Ja bym to zrobił o tak

Kopiuj
for a in range(-10,10,1):
	a /= 10
	print(a)

edit:post wyżej już wspomniano o tym sposobie.

edytowany 2x, ostatnio: sig
katelx
  • Rejestracja:około 10 lat
  • Ostatnio:5 miesięcy
  • Lokalizacja:Hong Kong
0
Kopiuj
for a in xrange(21):
    print (a - 10) / 10.0
EV
  • Rejestracja:około 10 lat
  • Ostatnio:ponad 8 lat
  • Postów:25
0

Dzięki wielkie :)!

bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

A swoją drogą ciekawe dlaczego niedokładność reprezentacji liczb zmiennoprzecinkowych daje efekty przy dodawaniu, a nie daje przy dzieleniu przez 10.

Kopiuj
from numpy import *

for n in arange(-1,1.000001,0.1):
    print(n)    
print(arange(-1,1.000001,0.1))

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
SI
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 2 godziny
0

Dzielenie liczby całkowitej przez dziesięć i jego wielokrotności to zwykłe dopisanie do zmiennej gdzie wstawić przecinek, dużo prostsze od dodawania liczb zmiennoprzecinkowych

bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

Ty tak poważnie?
x = 0,110 = 0,00011(0011)2
Gdzie wstawić przecinek w x/10?


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
katelx
  • Rejestracja:około 10 lat
  • Ostatnio:5 miesięcy
  • Lokalizacja:Hong Kong
0

@bogdans mysle ze chodzi o domyslne zaokraglenie metody __str__ klasy float, po wywolaniu:

Kopiuj
for a in xrange(21):
    value = (a - 10) / 10.0
    print "%0.12f %0.18f" % (value, v`code> output:`-1.000000000000 -1.000000000000000000
-0.900000000000 -0.900000000000000022
-0.800000000000 -0.800000000000000044
-0.700000000000 -0.699999999999999956
-0.600000000000 -0.599999999999999978
-0.500000000000 -0.500000000000000000
-0.400000000000 -0.400000000000000022
-0.300000000000 -0.299999999999999989
-0.200000000000 -0.200000000000000011
-0.100000000000 -0.100000000000000006
0.000000000000 0.000000000000000000
0.100000000000 0.100000000000000006
0.200000000000 0.200000000000000011
0.300000000000 0.299999999999999989
0.400000000000 0.400000000000000022
0.500000000000 0.500000000000000000
0.600000000000 0.599999999999999978
0.700000000000 0.699999999999999956
0.800000000000 0.800000000000000044
0.900000000000 0.900000000000000022
1.000000000000 1.000000000000000000
edytowany 1x, ostatnio: katelx
bogdans
Zgoda, błędy są i przy dzieleniu i przy sumowaniu. Przy sumowaniu zapewne większe na skutek kumulacji. Ciekawie jest w Javie https://ideone.com/JsR7sS
0

Tak przy okazji xrange się nie stosuje, jest deprecated.

Wizzie
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 7 lat
1

Skąd taki pomysł? W Pythonie 2 powinno się nawet stosować xrange, bo jest znacznie wydajniejsze, a w Pythonie 3 po prostu go nie ma i range działa jak xrange z Py2.

katelx
  • Rejestracja:około 10 lat
  • Ostatnio:5 miesięcy
  • Lokalizacja:Hong Kong
0

dokladnie, osobiscie poza paroma szczegolami wole 2.x i wlasnie jego uzywam

0

Range po prostu daje iterator, więc to nie jest kwestia "wydajności", nie tworzy fizycznie listy.

Natomiast range tworzy fizycznie całą listę. Zależnie co potrzebujemy, tego stosujemy.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.