2017-08-23 67 views
6

Czy istnieje szybki sposób pobrania 2.0 do pewnego stopnia zmiennoprzecinkowego x? Mam na myśli coś szybszego niż pow(2.0, x), a najlepiej to, co wektoryzuje się z AVX2.Szybka liczba zmiennoprzecinkowa 2 na x86_64

Odpowiednikiem liczb całkowitych jest 1<<n, ale działa tylko dla liczby całkowitej n.

+1

Wystarczy krótka myśl, jak zrobić "1 << n" i rzut do podwójnego. Przepraszam, jeśli to brzmi głupio :-) – Malice

+0

Wątpię, czy istnieje szybszy sposób na '2 zasilany na x' w zmiennoprzecinkowej. Wersja całkowita korzysta ze sposobu, w jaki jego sklep przyspiesza (2, x) i wątpię, czy dostaniesz takie zalety na reprezentacjach zmiennoprzecinkowych. – Malice

+0

@Malice, problem polega na tym, że 'x' nie jest liczbą całkowitą, jest zmiennoprzecinkowe punkt. –

Odpowiedz

9

Jest to standardowy std::exp2(double n)

Oblicza 2 podniesiony do danej mocy n

Jest możliwe, że exp2(x) nie byłoby szybciej niż pow(2.0, x) w danym środowisku, ale jest to bardziej szczegółowe niż ogólny pow.

+3

W ostatnim linuksie, w którym glibc zawiera libmvec, 'g ++ -Ofast' zarządza wektorowaniem' std :: exp (x * std :: log (2)) 'ale nie' std :: exp2 (x) ', co dziwne. –

1

Dla całkowitych uprawnień, można użyć std::ldexp:

double x = std::ldexp(1.0, k); // 2 to the power of k 

To jest lepsze niż 1<<k i odlewania, ponieważ nie będzie mieć pośredni przepełnienia, a także wspiera także negatywne moce.

+0

Wyzwanie polega na przeniesieniu 2 do potęgi zmiennoprzecinkowej 'x', która nie jest liczbą całkowitą" k ". –

+0

Jeśli 'k' jest liczbą całkowitą i nie musisz sprawdzać, czy jest poza zakresem, chcesz ręcznie wypchnąć wykładniczy wykładnik na IEEE 754' double' z przesunięciem bitowym i dodatkiem (do uprzedzić wykładnik i ustawić mantysę z tą samą operacją). To by się dobrze wektoryzowało. –

Powiązane problemy