Непонятное поведение цикла while

Peretyaka

Новичок
Этот код не выведет ничего:
PHP:
$a = (float) 0;
for ($b = 0; $b < 100; $b++) {
    while($a < $b) {
        if ($a == $b) {
            var_dump($a); var_dump($b);
            echo PHP_EOL;
        }
        $a += 1/10;
    }
}
Зато этот:
PHP:
$a = (float) 0;
for ($b = 0; $b < 100; $b++) {
    while($a < $b) {        
        var_dump($a); var_dump($b);
        echo PHP_EOL;
        
        $a += 1/10;
    }
}

float(0)
int(1)

float(0.1)
int(1)

...

float(0.9)
int(1)

float(1)
int(1)

float(1.1)
int(2)

...

float(1.9)
int(2)

float(2)
int(3)

....
Как вывелось 1 и 1, если в цикле проверка меньше.

Кроме 1, еще повторяется 5 и 76. Почему?

Почему if не вывел ничего, хотя мы явно видим интерации с одинаковыми значением?

Короче, не вижу никакой логики, подскажите у кого какие мысли?
 

Ragazzo

TDD interested
HA-HA

сравнивать флоат в цикле с инт для проверки условия?хм.. почитай что так не нужно делать, и вообще как числа представляются.
 

Peretyaka

Новичок
сравнивать флоат в цикле с инт для проверки условия?хм.. почитай что так не нужно делать, и вообще как числа представляются.
Тип не имеет значение, явное приведение к типу, тоже, ничего не дало. Это первое с чем я начал экспериментировать.

И почему это нельзя сравнивать int и float? Все корректно приведется автоматически.
 

Ragazzo

TDD interested
Peretyaka
Можно, но только если ты задаешь определенную погрешность эпсилон, иначе у тебя могут получаться различные результаты, числа с плавающей запятой хранятся в памяти неточно (вообще все числа храняться неточно, но это неважно).
 

Peretyaka

Новичок
Здесь допуск до десятых, я думаю, до машинной погрешности далековато.
 
Сверху