Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Деление вещественного числа / 11 сообщений из 11, страница 1 из 1
12.03.2015, 10:34
    #38902123
skywriter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Деление вещественного числа
Не ожидал споткнуться об такую ерунду...
В общем провожу операцию деления:

Код: java
1.
2.
3.
4.
5.
6.
7.
public class TestDivision {
        public static void main(String[] args) {
                System.out.println(String.format("fraction: %f", 1.0*6 / 16));
                System.out.println(String.format("fraction: %f", 1.0*6 / 4*4));
                System.out.println(String.format("fraction: %f", 1.0*6 / 4*4.0));
        }
}



Я ожидаю, что во всех случаях результат будет одинаковым, поскольку операция умножения заявлена в качестве более приоритетной, чем деление. При этом умножение на 1.0, предположительно, должно преобразовать числитель к типу float, чтобы произошло именно деление с вещественным результатом, а не деление нацело. Но вот то получается на самом деле:

$ java TestDivision
fraction: 0,375000
fraction: 6,000000
fraction: 6,000000

Проверял как на OpenJDK 1.7, так и на Oracle JDK 1.7 (jdk-7-oracle-armhf). Почему так???
...
Рейтинг: 0 / 0
12.03.2015, 10:41
    #38902141
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Деление вещественного числа
Код: java
1.
2.
3.
4.
5.
6.
7.
public class TestDivision {
        public static void main(String[] args) {
                System.out.println(String.format("fraction: %f", 1.0*6 / 16));
                System.out.println(String.format("fraction: %f", 1.0*6 / 4*4));
                System.out.println(String.format("fraction: %f", 1.0*6 / (4*4)));
        }
}
...
Рейтинг: 0 / 0
12.03.2015, 10:48
    #38902156
Partisan M
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Деление вещественного числа
skywriterЯ ожидаю, что во всех случаях результат будет одинаковым, поскольку операция умножения заявлена в качестве более приоритетной, чем деление.

Кто это заявил? Умный мальчик Вовочка? Смотрю документацию:
Operators

Там показано, что у умножения и деления одинаковый приоритет.
...
Рейтинг: 0 / 0
12.03.2015, 10:49
    #38902161
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Деление вещественного числа
а если подробнее то здесь и здесь .
И приучитесь писать так, чтобы было - unambiguous, recommended
...
Рейтинг: 0 / 0
12.03.2015, 10:51
    #38902163
skywriter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Деление вещественного числа
Сергей Арсеньев, понятно. Начал забывать приоритет операций...
...
Рейтинг: 0 / 0
12.03.2015, 10:53
    #38902164
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Деление вещественного числа
Даже в таких злачных местах
Крупными буквами пишут

Brackets
Order
Division
Multiplication
Addition
Subtraction


и мелкими оставляют приписку
Kingsley OsimeHowever, one should be careful to understand that these operators are in actuality grouped by classes of precedence, where division and multiplication have the same precedence
...
Рейтинг: 0 / 0
12.03.2015, 12:47
    #38902314
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Деление вещественного числа
Стыдно не знать printf. Этож целая эпоха...
Код: java
1.
2.
3.
4.
5.
6.
7.
public class TestDivision {
        public static void main(String[] args) {
                System.out.printf("fraction: %f \n", 1.0*6 / 16);
                System.out.printf("fraction: %f \n", 1.0*6 / 4*4);
                System.out.printf("fraction: %f \n", 1.0*6 / 4*4.0);
        }
}
...
Рейтинг: 0 / 0
13.03.2015, 20:35
    #38904509
skywriter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Деление вещественного числа
mayton, не стыдно. В ту эпоху я писал на Delphi. А позже от одного бывшего коллеги, который программировал DSP на C++, слышал, что printf - страшное зло, т.к. существенно изменяют тайминги выполнения элементов кода. Вот так и отложилось в памяти: printf == зло. =))
...
Рейтинг: 0 / 0
13.03.2015, 21:08
    #38904529
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Деление вещественного числа
Не гарантировано время любых операций ввода/вывода. Мне, например, приходилось видеть "Sector read error on drive C" в сочетании с, примерно, минутным ожиданием ошибки.
За что же именно printf-у такая немилость?
...
Рейтинг: 0 / 0
13.03.2015, 23:29
    #38904612
skywriter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Деление вещественного числа
Basil A. SidorovНе гарантировано время любых операций ввода/вывода. Мне, например, приходилось видеть "Sector read error on drive C" в сочетании с, примерно, минутным ожиданием ошибки.
За что же именно printf-у такая немилость?
Ну я так-то привык использовать logging frameworks. О том, что у sout есть что-то кроме println() - для этой мысли даже места в голове не было.
...
Рейтинг: 0 / 0
13.03.2015, 23:33
    #38904618
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Деление вещественного числа
skywritermayton, не стыдно. В ту эпоху я писал на Delphi. А позже от одного бывшего коллеги, который программировал DSP на C++, слышал, что printf - страшное зло, т.к. существенно изменяют тайминги выполнения элементов кода. Вот так и отложилось в памяти: printf == зло. =))
printf может быть только злом когда вы считаете микросекунды. И я готов спорить что профилирование вашего ПО
выдаст 80% лагов совершенно в другом месте отличном от printf.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Деление вещественного числа / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]