Шаг сетчика в операторе for

Страницы: 1
RSS
Шаг сетчика в операторе for, Некорректная работа оператора for при нецелочисленном шаге
 
Сегодня столкнулся с некорректной работой оператора for, если задать не целочисленный шаг счетчика

Простой пример
Код
for x=1,2,0.1 do
 message("x="..x)
end
Логично ожидать перебор значений от 1 до 2 включительно с шагом 0.1
Однако перебор значений идет от 1 только до 1.9

Пришлось выкручиваться костылем, типа такого
Код
for x=10,20,1 do
 message("x="..x/10)
end

Причем косячит не для всех шагов, например при шаге 0.2 все корректно.


QUIK 9.7.1.10
 
Арифметика арифметика чисел с плавающей запятой работает с некоторой точностью. Поэтому при сложении выходит, например не 2, а 2.0000000001.
Необходимо, либо делать свой итератор, либо добавляйте дельту погрешности меньше шага для гарантированного включения числа в перебор.
 
Цитата
BlaZed написал:
Сегодня столкнулся с некорректной работой оператора for, если задать не целочисленный шаг счетчика

Простой пример
Код
   for  x =  1 , 2 , 0.1   do 
  message ( "x="  .. x)
 end 
  
Логично ожидать перебор значений от 1 до 2 включительно с шагом 0.1
Однако перебор значений идет от 1 только до 1.9
В данном случае на последнем шаге получается x=2.0+8.8817841970013e-016  
 
вообще-то  ,
обычно в букварях по программированию предупреждают,
что не надо использовать точное сравнение для вещественных чисел.
чтобы не было мучительно больно.
 
чтобы было  правильно ,
надо изменить границу цикла, чтобы результат проверялся не на равно.
как правило путем добавления половины шага
 
например так:
for x=1,2.05,0.1 do  print("x="..x) end
------------
x=1.0
x=1.1
x=1.2
x=1.3
x=1.4
x=1.5
x=1.6
x=1.7
x=1.8
x=1.9
x=2.0
-----------------
Страницы: 1
Читают тему
Наверх