2013-05-10 17 views
8

Say mam ten numer:Jak uzyskać numerację części wielokrotnych?

// bmp = boost::multiprecision 
bmp::cpp_dec_float n("123456789.1234567891011121314"); 

swoich danych zaplecza są:

[0] 1   unsigned int 
[1] 23456789 unsigned int 
[2] 12345678 unsigned int 
[3] 91011121 unsigned int 
[4] 31400000 unsigned int 
... 0 
[15] 0   unsigned int 

który jest dokładnie to, co chcę dostać; niestety nie znajduję sposobu, aby uzyskać obie części mojego numeru jako bmp::int128_t - na przykład-- lub bazowe dane mojego numeru.

Oznacza to, że podoba mi się coś takiego istnieje:

bmp::int128_t integerPart; 
bmp::int128_t floatPart; 
n.getParts(integerPart, floatPart); 

lub

auto&& data = n.data(); // which is actually private when using `cpp_dec_float`. 

Zresztą, czy ktoś wiedział, jak robić to, co staram się osiągnąć?

Dla potrzeb zapisu potrzebuję tego, aby wyrazić dużą liczbę dziesiętną jako dziesiętną C# ze względu na interoperacyjność.

Odpowiedz

-1

Podejrzewam, że prawdopodobnie możesz użyć wartości eval_frexp, aby uzyskać wartości, których szukasz, chociaż nadal musisz sprawdzić, czy pasują do typu C# dziesiętnego. Zobacz instrukcję na temat wymogów zaplecza Boost.Multiprecision tutaj: http://www.boost.org/doc/libs/1_53_0/libs/multiprecision/doc/html/boost_multiprecision/ref/backendconc.html

Zawsze można po prostu wykonaj longhand matematyczne i zakresu kontroli; jeśli nie przesyłasz zbyt wielu liczb, może to być wystarczająco szybkie.

Powiedziawszy to wszystko, zapraszamy do być niegrzeczne i zrobić coś takiego:

#define private public 
#define protected public 
#include <boost/multiprecision/cpp_dec_float.hpp> 
#undef private 
#undef protected 

Ale jeśli przerwy w przyszłej wersji, pojawi się zachować zarówno kawałki.


Hej, dzięki za głosowanie bez komentarza. To naprawdę pomocne.

Aby wyjaśnić moje komentarze powyżej:

Korzystanie eval_frexp: po dalszych badań, wydaje się, że nadal jest tylko eval_frexp(b, cb, pi) oferujących potęgi 2, a nie 10 jak uprawnienia wydaje się być wymagane dla danego typu Decimal. Podejrzewam więc, że musisz wykonać arytmetykę w długiej formie, jeśli chcesz używać tylko interfejsu publicznego.

Abusing private członków: Autorzy i opiekunowie zajęć Boost.Multiprecision zaprojektowali je zgodnie z określonymi wytycznymi; najwyraźniej ocenili przyszłe zabezpieczenia jako ważniejsze niż zapewnienie dostępu do wewnętrznej struktury:

Szablon klasy cpp_dec_float spełnia wszystkie wymagania dla typu Backend. Jego członkowie i funkcje niebędące członkami są świadomie nieudokumentowane: są to dane dotyczące implementacji, które mogą ulec zmianie. (http://www.boost.org/doc/libs/1_53_0/libs/multiprecision/doc/html/boost_multiprecision/ref/cpp_dec_ref.html)

moja propozycja, która została wyraźnie oznaczona jako „niegrzeczne”, a z ostrzeżeniem, że to może złamać w przyszłym wydaniu, było nałożyć na potrzeby projektu PO przed tymi autora B.MP.

Bardzo najczystszą metodą może być zaproponowanie zmiany w klasie cpp_dec_float, w której ujawniona jest struktura wewnętrzna; biorąc pod uwagę nieodparty przypadek użycia i analizę tego, ile kodu historycznie się zmieniło, może nawet zostać zaakceptowana.

Mam nadzieję, że to pomoże. Jeśli czytelnicy nadal mają z tym problem, możesz go zgłosić, ale proszę dać mi znać, która część Cię niepokoi, abym mógł spróbować ją poprawić.

+0

To nie ja , ale '# define'ing keywords jest niezdefiniowanym zachowaniem i (prawie?) nigdy nie jest solidnym rozwiązaniem problemów –

+0

Och, nie ma tam argumentu. Próbowałem sformułować oryginalną odpowiedź (i mój złośliwy komentarz na temat stanowiska), aby było jasne, że nie jest to coś, co jest dobrym pomysłem do wykorzystania w produkcji. Jeśli OP naprawdę potrzebuje tej zdolności przez długi czas, to jeśli nie będą w stanie przekonać opiekunów B.MP, powinni po prostu ją rozwidlić i zassać do swojej bazy kodowej - pozwala na to BPL. Właśnie próbowałem zaoferować rozwiązanie "jest godzina dwudziesta trzecia i potrzebujesz go jutro". Może to zasługa, dunno. – AnthonyFoiani

+0

Zabawna anegdota: Próbowałem stworzyć meme "#define private public; NO REGRETS" na wewnętrznym generatorze memów w mojej obecnej firmie ... aby zostać przekierowane do * istniejącego * przykładu. Sądzę więc, że nie jestem jedyną duszą z demencją z tym pomysłem. :) – AnthonyFoiani

0

Nie wiem, czy jest to czego szukasz, spróbuj ...

cpp_dec_float_100 myreal(100); 
cpp_dec_float_100 int_part = myreal.backend().extract_integer_part(); 

Typ jest nadal cpp_dec_float_100, ale zawiera tylko część całkowitą. Mam nadzieję, że to pomoże.

1

Z dokumentacji doładowania tylny koniec jest celowo nieprzezroczysty, ponieważ może się zmienić w dowolnym momencie bez ostrzeżenia. (Class template cpp_dec_float fulfils all of the requirements for a Backend type. Its members and non-member functions are deliberately not documented: these are considered implementation details that are subject to change.) od http://www.boost.org/doc/libs/1_55_0/libs/multiprecision/doc/html/boost_multiprecision/ref/cpp_dec_ref.html

O ile widzę, masz tutaj dwie możliwości. Możesz spojrzeć na kod źródłowy dla konkretnej wersji używanej klasy zaplecza, uzyskaj dostęp do niej za pomocą metody number przy użyciu metody backend i miej nadzieję, że backend nigdy się nie zmieni (szczególnie rozważ zmiany, które tylko zepsuły format binarny, a nie kompilację) .

Alternatywnie polecam wziąć znaków reprezentujący cpp_dec_float i podzielić ją na siebie dwóch części, przy użyciu string lub char* konstruktorów dla podstawowych typów integralnych, które Cię interesują.

+0

+1, z dodatkową informacją, że licencja publiczna Boost umożliwia kopiowanie do niemal dowolnego użytku, w tym komercyjnego. Jeśli wewnętrzna reprezentacja, jeśli jakaś wersja jest dokładnie tym, czego potrzebuje/chce OP, wówczas, jeśli właściciele Boost.MultiPrecision nie mogą być przekonani do zamrożenia jednej implementacji, OP może je zamrozić samodzielnie. – AnthonyFoiani

Powiązane problemy