2017-01-01 6 views
6

В настоящее время я изучаю номера плавающей запятой java. Я знаю, что поплавок имеет определенное количество значительных ресурсов. Я также знаю, что float представлен в java как -1 или 1 * num * 10^x. Где num - число, а 10^x - десятичная «точка». Но здесь у нас нет доли числа. Как возможен бесконечный цикл?Java Infinite while Loop - float 123456789

Код с бесконечной петлей:

float f = 123456789; 
while (f-- > 0) { 
System.out.println(f); 
} 
+1

Вы уверены, что цикл бесконечен? Что происходит после того, как f станет 0? –

+0

f остается неизменным и не уменьшается. Это бесконечный цикл. Это экзаменационный вопрос в университете в прошлом году (пример экзамена). – thomas

+0

f не является достаточно точным для представления этого числа (f--) является решением, но почему? – thomas

ответ

4

Это про арифметику с плавающей точкой. Когда вы уменьшаете число, которое вы натыкаетесь на ситуацию, когда вы проходите через номер f = 1.23456792E8, все идет не так, потому что f-1 и f имеют одинаковое представление с плавающей запятой. Таким образом, декрементирование делает само число, что приводит к бесконечному циклу. Просто проверьте:

System.out.println(1.23456792E8f); 
System.out.println(1.23456792E8f - 1); 

Что такого особенного в отношении количества и почему выполнение останавливается? Это связано с тем, что представление с плавающей запятой 123456789 - это 1.23456792E8. Уже это дает нам пробел как минимум 3 из-за отсутствия точности чисел с плавающей запятой. Использование double вместо float делает программу законченной, но проблема будет возникать с более высокими номерами.

+0

что вы делаете означает уничтожить все? –

+0

алгоритм - спасибо, я его поменю –

+0

почему это не 0.23456792E8? – thomas