2011-12-16 8 views
5

Biorąc pod uwagę double x i zakładając, że leży on w [0,1]. Załóżmy na przykład, że x = 0,3 binarnie (przechowywanie 10 miejsc po przecinku), jest przedstawiony jakoWyodrębnianie cyfr z elementu pływającego C++

x=0.0100110011... 

że chce napisać kod C++, który wyodrębnić 10 cyfry widoczne po przecinku . Innymi słowy chcę wyodrębnić liczbę całkowitą (0100110011) _2.

Teraz jestem zupełnie nowy w bitowego przesunięcia i (naiwnego) rozwiązanie, które mam za problem jest następujący

int temp= (int) (x*(1<<10)) 

Następnie temp binarnie będą mieć necesary 10 cyfr.

Czy to jest bezpieczny sposób na wykonanie powyższego procesu? ALBO czy istnieją bezpieczniejsze/bardziej poprawne sposoby na zrobienie tego?

Uwaga: Nie chcę, aby cyfry były wyodrębniane w postaci tablicy znaków. W szczególności chcę, aby liczba całkowita (LUB bez znaku liczby całkowitej) dla tego. Powodem tego jest to, że w generowaniu ośmiu punktów punkty w przestrzeni otrzymują klucze skrótów bazujące na ich pozycji nazwanej jako Morton Keys. Te klucze są zwykle przechowywane jako liczby całkowite. Po uzyskaniu kluczy integracyjnych dla wszystkich punktów są one następnie sortowane. Teoretycznie te klucze można uzyskać przez skalowanie współrzędnych do [0,1], wyodrębnianie bitów i przeplatanie ich.

+4

10 cyfr binarnych lub cyfr dziesiętnych? –

+0

Dlaczego nie wydrukować * całej * mantysy z tylu zerami, które są wymagane w razie potrzeby? –

+0

@ Oli Charlesworth: Zobacz edycję. Wyjaśniłem moje pytanie. – smilingbuddha

Odpowiedz

1

Zastosowanie memcpy skopiować dwukrotnie na tablicę liczb 32-bitowych, jak to:

unsigned int b[2]; // assume int is 32-bits 
memcpy(b, &x, 8); 

najwyżej 10 cyfr znaczących binarne są w b[0] lub b[1], w zależności od tego, czy komputer jest big- lub mało -endian.

EDYCJA: To samo można osiągnąć za pomocą niektórych rzutów zamiast memcpy, ale naruszałoby to ścisłe zasady aliasingu. Alternatywą jest użycie union.

+1

+1 za podanie wielu opcji. –

+0

W PO zadała 10 cyfr po kropce dziesiętnej, a nie 10 najbardziej znaczących cyfr. Tak więc wykładnik również musi być brany pod uwagę. (Ale proponowane przez PO rozwiązanie jest całkowicie wystarczające do wykonania tego zadania, bez konieczności dzielenia bitów.) – TonyK

0

Przeczytaj to: http://chrishecker.com/images/f/fb/Gdmfp.pdf

Jeśli można grok co ten artykuł jest informacją, można czerpać algorytm, którego szukasz. Po prostu pamiętaj o współczynniku odchylenia w wykładniku i domyślnej wiodącej w mantysie, a reszta powinna znaleźć się na swoim miejscu.

+0

ack, czytanie niepowodzenie rozumienia. Twoje naiwne rozwiązanie powinno działać równie dobrze.Powyższy artykuł i tak jest dobrą informacją. – mcmcc