воскресенье, 2 сентября 2007 г.

Java Puzzle 34: Down for the Count

Так же как и в головоломках 26 и 27 мы должны узнать количество итераций цикла (count):
final int START = 2000000000;
int count = 0;
for (float f = START; f < START + 50; f++)
    count++;

Если вы думаете, что count == 50, то ошибаетесь. Это вам не целочисленная арифметика! Начальное значение цикла близко к максимальному и требует 31 бит, но тип float предоставляет только 24 бита для точности числа. Часть числа теряется при конвертации, т.е. (float)2000000000 == (float)2000000050. Вот так и получается, что тело цикла не будет выполнено...

Авторы не рекомендуют использовать float и double как индекс цикла, так как поведение при больших значениях непредсказуемо. Если же все-таки нужно использовать арифметику с плавающей точной, то лучше использовать double, так как тут больше точность. И будьте начеку!

4 комментария:

  1. Слущай, СЭМми, а это всё твои решения пазлов жабских, или ты самое интересное подбираешь? Может, тебе ветку на сайте своем создать, куда все складывать? Полезно будет.

    ОтветитьУдалить
  2. Это я последовательно читаю книжку Джошуа Блоха "Java Puzzlers" на английском языке. Выкладывать мне проще на блог, а выборку можно по тегу puzzle делать...

    ОтветитьУдалить
  3. А вдруг у тебя еще другие какие паззлы будут? Надо еще пару тегов добавить...

    ОтветитьУдалить
  4. Будем решать проблемы по мере их поступления.

    ОтветитьУдалить