Login
float в java
NEW 16.05.08 10:15
Люди, в общем имеется следующий код:
float f1 = Float.MAX_VALUE;
float f2 = f1 - 1e30f;
System.out.println(f1==f2);
А теперь вопрос, почему последнее выражение выдает true? Просьба не закидывать камнями
На яве програмлю уже давно, но с таким еще не приходилось сталкиваться...
Что тут за трюк? Буду рад любой информации.
float f1 = Float.MAX_VALUE;
float f2 = f1 - 1e30f;
System.out.println(f1==f2);
А теперь вопрос, почему последнее выражение выдает true? Просьба не закидывать камнями

Что тут за трюк? Буду рад любой информации.
http://denis-aristov.ucoz.com
NEW 16.05.08 11:08
in Antwort kashej 16.05.08 10:15
видимо, потому, что float - тип с плавающей точкой и потому неточный. У максимального флоута порядок 10^38, так что твое вычитание числа порядка 10^30 ему как слону дробина.
NEW 16.05.08 15:41
in Antwort kashej 16.05.08 10:15
NEW 17.05.08 12:03
in Antwort Chipolino 16.05.08 15:41
Числа с плавающей точкой так не сравниваются.
-----
А подумать? У человека как раз вопрос - Почему они равны? - а не то, что сравнение должно выполняться по-другому.
-----
А подумать? У человека как раз вопрос - Почему они равны? - а не то, что сравнение должно выполняться по-другому.
NEW 17.05.08 12:11
in Antwort kashej 16.05.08 10:15
На яве програмлю уже давно, но с таким еще не приходилось сталкиваться...
-----
А это и не Жаба. Это - float сам по себе.
Хранение float'а - {порядок} {нормализованная мантиса}. Перед сложением и вычитанием мантиса денормализуется до сравнивания порядков. В твоем случае - остаток в значимых разрядах мантисы будет нулем и вычитание ничего не изменит.
-----
А это и не Жаба. Это - float сам по себе.
Хранение float'а - {порядок} {нормализованная мантиса}. Перед сложением и вычитанием мантиса денормализуется до сравнивания порядков. В твоем случае - остаток в значимых разрядах мантисы будет нулем и вычитание ничего не изменит.
NEW 17.05.08 12:19
in Antwort digital.pilot 16.05.08 11:08
У максимального флоута порядок 10^38, так что твое вычитание числа порядка 10^30 ему как слону дробина.
-----
Хммм... Сейчас уже не помню, но где-то видел не 10^38, а что-то побольше... 10^308, если не ошибаюсь.
Бо, разница 10^8 - восемь значащих (десятичных) цифр - не такая большая и должна бы все же давать эффект при вычитании.
Вообщем, надо смотреть доки на Жабу по деталям реализации float'a.
-----
Хммм... Сейчас уже не помню, но где-то видел не 10^38, а что-то побольше... 10^308, если не ошибаюсь.
Бо, разница 10^8 - восемь значащих (десятичных) цифр - не такая большая и должна бы все же давать эффект при вычитании.
Вообщем, надо смотреть доки на Жабу по деталям реализации float'a.
NEW 17.05.08 14:05
in Antwort Murr 17.05.08 12:19
Сейчас уже не помню, но где-то видел не 10^38, а что-то побольше... 10^308, если не ошибаюсь.
Это double, а не float.
Это double, а не float.
NEW 17.05.08 15:51
in Antwort femidav 17.05.08 14:05
NEW 17.05.08 16:13
in Antwort Chipolino 17.05.08 15:55
На последнего...
Просто дело в том, что мне нужно написать функцию, которая ожидает некоторое время определенное значение числа с плавающей точкой. При том это значение может находится в определенном интервале. Короче прототип функции такой:
boolean waitValue(float standard, long timeout, float tolerance);
Если значение вдруг оказывается между standard-tolerance и standard+tolerance то функция возвращает TRUE
Т.е. по сути пользователя ничего не сдерживает установить standard Float.MAX_VALUE. Тогда верхняя планка так и останется Float.MAX_VALUE, но а нижняя должна быть меньше. Вот тут-то я и удивился, когда отнял от standard tolerance а разницы как-будто и нет.
Просто дело в том, что мне нужно написать функцию, которая ожидает некоторое время определенное значение числа с плавающей точкой. При том это значение может находится в определенном интервале. Короче прототип функции такой:
boolean waitValue(float standard, long timeout, float tolerance);
Если значение вдруг оказывается между standard-tolerance и standard+tolerance то функция возвращает TRUE
Т.е. по сути пользователя ничего не сдерживает установить standard Float.MAX_VALUE. Тогда верхняя планка так и останется Float.MAX_VALUE, но а нижняя должна быть меньше. Вот тут-то я и удивился, когда отнял от standard tolerance а разницы как-будто и нет.
http://denis-aristov.ucoz.com
NEW 17.05.08 20:23
in Antwort kashej 17.05.08 16:13
отнял от standard tolerance
-----
А вот это уже то, об чем писал Чиполино - abs(Standard - Value) < tolerance
И подстрахуйся на предмет переполнения при вычитании.
-----
А вот это уже то, об чем писал Чиполино - abs(Standard - Value) < tolerance
И подстрахуйся на предмет переполнения при вычитании.

NEW 22.05.08 12:24
in Antwort kashej 17.05.08 16:13
при флоате важно как диапазон представления чисел, так и количество значащих разрядов.
Если диапазон
float 32 bit java.lang.Float +/-1,4E-45 ... +/-3,4E+38
double 64 bit java.lang.Double +/-4,9E-324 ... +/-1,7E+308
http://de.wikipedia.org/wiki/IEEE_754#Zahlenformate_und_andere_Festlegungen_des_IEEE_754-Standards
In float, 24 bits are allocated for a. Thus the largest integer that can be exactly stored is 2^0 + 2^1 + ... + 2^23 = (2^24)−1 = 16,777,215
То бишь 8 значащих цифр после запятой. Так вот толерансе не должно быть тогда меньше чем 0.0000 0001
Если диапазон
float 32 bit java.lang.Float +/-1,4E-45 ... +/-3,4E+38
double 64 bit java.lang.Double +/-4,9E-324 ... +/-1,7E+308
http://de.wikipedia.org/wiki/IEEE_754#Zahlenformate_und_andere_Festlegungen_des_IEEE_754-Standards
In float, 24 bits are allocated for a. Thus the largest integer that can be exactly stored is 2^0 + 2^1 + ... + 2^23 = (2^24)−1 = 16,777,215
То бишь 8 значащих цифр после запятой. Так вот толерансе не должно быть тогда меньше чем 0.0000 0001
NEW 22.05.08 19:05
in Antwort AlexNek 22.05.08 12:24
Для этого в плюсовой stdlib имеется numeric_limits<T>::epsilon , что-нибудь подобное в джаве должно быть .
NEW 22.05.08 21:27
in Antwort Chipolino 22.05.08 19:05
Да я на яве не пишу, так только знакомым студентам иногда помогаю.
NEW 26.05.08 17:28
in Antwort AlexNek 22.05.08 21:27
Сравнить два флоата - не проблема. Нужно просто конвертировать оба числа в байтовые массивы, а потом сравнить эти массивы. Но вот как определить какое число > или < или же <= или >=.
Может кто-нибудь знает библиотеку, которая предоставляет эти функции?
Может кто-нибудь знает библиотеку, которая предоставляет эти функции?
http://denis-aristov.ucoz.com
NEW 26.05.08 18:24
in Antwort kashej 26.05.08 17:28
NEW 26.05.08 18:53
самое плохое решение которое можно придумать. Перечитай еще раз ссылки и поиграйтся с разными числами.
Коротко, вещественные числа считаются равными если они отличаются на значение меньшее заданной точности. При этом заданная точность не может быть меньше реально представленной. Не путать точность и диапазон представляемых чисел!
in Antwort kashej 26.05.08 17:28
В ответ на:
Сравнить два флоата - не проблема. Нужно просто конвертировать оба числа в байтовые массивы, а потом сравнить эти массивы.
Сравнить два флоата - не проблема. Нужно просто конвертировать оба числа в байтовые массивы, а потом сравнить эти массивы.
самое плохое решение которое можно придумать. Перечитай еще раз ссылки и поиграйтся с разными числами.
Коротко, вещественные числа считаются равными если они отличаются на значение меньшее заданной точности. При этом заданная точность не может быть меньше реально представленной. Не путать точность и диапазон представляемых чисел!
NEW 26.05.08 21:07
in Antwort katran76 26.05.08 18:24
Да я в курсе вообще-то, что в яве нет перегрузки операторов
имел ввиду другое, жаль что ты не понял

http://denis-aristov.ucoz.com
26.05.08 21:13
in Antwort kashej 26.05.08 21:07
NEW 27.05.08 13:26
in Antwort kashej 26.05.08 17:28
Нужно просто конвертировать оба числа в байтовые массивы, а потом сравнить эти массивы.
-----
??? - Ну и что же ты получишь, сравнивая 1.0*10^0 и 0.1*10^1?
P.S. К понимающим в чем именно проблемма просьба не подсказывать.
Но вот как определить какое число > или < или же <= или >=.
------
??? - указанные операторы кто-то запретил? Или они не работают с вещественными типами?
Если все определено, то надо искать проблему в пользующем...
-----
??? - Ну и что же ты получишь, сравнивая 1.0*10^0 и 0.1*10^1?
P.S. К понимающим в чем именно проблемма просьба не подсказывать.
Но вот как определить какое число > или < или же <= или >=.
------
??? - указанные операторы кто-то запретил? Или они не работают с вещественными типами?
Если все определено, то надо искать проблему в пользующем...