- 1
- 2
- 3
- 4
- 5
Float f = 1.25f;
int i = Float.floatToIntBits(f);
i++;
f = Float.intBitsToFloat(i);
//I wanted 2.25, but got 1.2500001 instead.
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+174
Float f = 1.25f;
int i = Float.floatToIntBits(f);
i++;
f = Float.intBitsToFloat(i);
//I wanted 2.25, but got 1.2500001 instead.
http://stackoverflow.com/questions/9921690/java-increment-through-float-floattointbits
bormand 11.02.2014 16:24 # 0
Тем более эффективно его не запилить... Разве что CAS'ом и циклом.
3.14159265 11.02.2014 17:16 # 0
Иначе никак.
bormand 11.02.2014 17:30 # 0
Всмысле? Что-то не распарсил я эту фразу ;(
3.14159265 11.02.2014 17:43 # +1
А добавление 1 к мантиссе это допустим добавление уже 1024 при соответствующей экспоненте.
Значит нам надо добавить 1024 (+1 к мантиссе, при экспоненте равной 1024), но с вероятностью 1/1024.
3.14159265 11.02.2014 17:52 # +1
http://ideone.com/t3zuGs
bormand 11.02.2014 18:01 # 0
http://ideone.com/p2PmR8
А вероятностный инкремент это интересная идея.
UPD: Хотя если число только инкрементят, то long'а хватит на все мыслимые сроки ;) 68 лет при 4ккк инкрементов в секунду.
roman-kashitsyn 11.02.2014 18:07 # +1
Ждём сарказма от Тараса на тему fixed point > long'а хватит на все мыслимые сроки
3.14159265 11.02.2014 18:17 # +1
Я думал это Царское дело.
TarasB 11.02.2014 19:17 # +2
Причины 3:
1. однородность поля (т.е. семантически лучше подходит)
2. детерминированность вычислений (про гарантии бит-в-бит одинаковых результатов от двух сопроцессоров я ничего не слышал)
3. на арм, что в моём планшете они быстрее плавучки (да-да, не поверите)
3.14159265 11.02.2014 19:49 # 0
Но Царь отличался зашкаливающей радиКАЛьностью суждений.
3Doomer 14.02.2014 11:38 # 0
TarasB 14.02.2014 16:37 # +1
Я чем-то болел?
Меня кто-то лечил?
3Doomer 14.02.2014 21:45 # 0
Царь всех лечил.
anonimb84a2f6fd141 12.02.2014 16:44 # −2
Эм а про strictfp в c# не слышал?
TarasB 12.02.2014 20:15 # +2
anonimb84a2f6fd141 12.02.2014 20:49 # −3
TarasB 14.02.2014 16:37 # +1
bormand 14.02.2014 16:43 # −1
TarasB 14.02.2014 17:14 # +1
bormand 14.02.2014 17:26 # −1
TarasB 14.02.2014 17:38 # +2
bormand 11.02.2014 18:18 # −1
3.14159265 11.02.2014 18:24 # 0
IEEE флоаты - срань, грубо говоря из-за того чисел начинающихся на 1, больше чем 2-9 вместе взятых.
Чисто экспонентные флоаты логарифмически равномерны и точны.
TarasB 11.02.2014 19:18 # +1
3.14159265 11.02.2014 21:39 # −1
Abbath 11.02.2014 21:56 # −1
guest 11.02.2014 22:00 # −1
Abbath 11.02.2014 23:19 # −1
3.14159265 11.02.2014 18:11 # −1
Естественно.
>Хотя если число только инкрементят, то long'а хватит на все мыслимые и немыслимые сроки
Я бы брал 128-битное, как минимум. А 256 перебрать-то точно всей энергии вселенной не хватит.
Частота процов уже ~5 Ггц=5*(10**9) inc/sec.
Есть интерфейсы передачи 10Gbit/sec=10**10 inc/sec. Уже в планах 100Гбит/сек.
(10**10)*3600*24*365*30 лет>2**63.
Ну поломается код через 30 лет, а к тому времени или кодер сдохнет, либо ишак, либо шах поменяет работу, либо проект выбросят и перепишут, либо заказчика не будет.
В 70-х тоже думали что для года достаточно джвух цифер.
3.14159265 11.02.2014 18:20 # −1
А если лонг знаковый:?
Флоат же нам запросто даст нам 2^128 за 32 бита.
bormand 11.02.2014 18:28 # −1
68 это уже знаковый.
> Флоат же нам запросто даст нам 2^128 за 32 бита.
И дорогущий инкремент с генерацией порядок-23 бит рандома, операциями над флоатом (ну ок, прямо над его бинарным представлением) и т.п. А на тех же говноконгруэнтных ГПСЧ с 32 битным состоянием нужные для переключения биты могут вообще никогда не выпасть...
Тут как бы 128-битный счетчик не оказался более быстрым...
bormand 11.02.2014 18:35 # −1
3.14159265 11.02.2014 18:43 # −1
С такой штукой даже беззнакового лонга ненадолго хватит.
3.14159265 11.02.2014 18:35 # 0
Вот напишешь long, а его из-за нового быстрого интерфейса передачи данных через 5 лет уже не хватит, придется всё перепиливать, а в коде и сигнатурах, которые использует клиентский код уже везде поставлен long.
Что делать? Вот float врядли переполнится... А точность около 1/2**24 во многих местах очень даже приемлима.
Тем более 128-бит не очень стандартны. Аппаратного CAS не припомню (по крайней мере в жабе и x86)
anonimb84a2f6fd141 12.02.2014 20:50 # −1
Stertor 12.02.2014 21:03 # −1
3.14159265 12.02.2014 21:59 # +2
bormand 12.02.2014 22:15 # −2
Безопасная жаба такая безопасная.
Konardo 12.02.2014 22:41 # −5
Lure Of Chaos 12.02.2014 22:53 # +1
kegdan 11.02.2014 16:56 # −1
3.14159265 11.02.2014 17:15 # −1
Konardo 12.02.2014 16:11 # −16
EfremoffPaul 14.02.2014 15:02 # −1