- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
typedef int32_t wl_fixed_t;
//было:
static inline double wl_fixed_to_double(wl_fixed_t f)
{
return (double) f / 256.0;
}
//стало:
static inline double wl_fixed_to_double(wl_fixed_t f)
{
union {
double d;
int64_t i;
} u;
u.i = ((1023LL + 44LL) << 52) + (1LL << 51) + f;
return u.d - (3LL << 43);
}
sayidandrtfm 16.05.2012 19:42 # 0
rat4 16.05.2012 20:08 # 0
bormand 16.05.2012 20:16 # 0
rat4 16.05.2012 21:39 # 0
bormand 16.05.2012 20:12 # +3
+f - младшие биты мантиссы заполняем нашим числом
(1023LL+44LL)<<52 - порядок равен 2^44
Т.о. младшие 8 бит f попали в дробную часть, а старшие 44 в целую, но к ним прибавили 2^43 (та самая единичка сдвинутая на 51) и 2^44 - неявная единичка в виртуальном 53 бите мантиссы.
Нижняя строчка как раз корректирует это, вычитая 2^43*3 = 2^43+2^44.
P.S. мое описание для положительных чисел, для отрицательных пока не вкурил, но тем не менее код работает и для них.
unu-foja 16.05.2012 21:05 # 0
bormand 17.05.2012 05:27 # 0
unu-foja 16.05.2012 21:05 # 0
bormand 16.05.2012 20:18 # 0
rat4 16.05.2012 20:23 # 0
UPD:
>int32_t
>2^44
Что-то тут не так...
bormand 16.05.2012 20:30 # 0
Xom94ok 16.05.2012 21:59 # 0
absolut 18.05.2012 09:15 # −1
sayidandrtfm 16.05.2012 22:17 # 0
someone 17.05.2012 06:59 # −1
rat4 17.05.2012 12:30 # 0
someone 17.05.2012 12:37 # 0
И я, если что, только за Wayland. Вот только непонятно, как там с блобами жить.
JavaGovno 17.05.2012 22:46 # 0
ctm 17.05.2012 08:03 # 0
rat4 17.05.2012 08:10 # 0
on x86:
benchmarked magic: 14.048889885s
benchmarked mul: 4.034106976s
on x86-64:
benchmarked magic: 2.467789582s
benchmarked mul: 8.665307997s
bormand 17.05.2012 09:36 # 0
rat4 17.05.2012 09:50 # 0
guest 18.05.2012 19:46 # 0