2013-05-10 29 views
8

Nói rằng tôi có điều này số:Làm cách nào để tăng các bộ phận số nhân?

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

dữ liệu phụ trợ của nó là:

[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 

đó là chính xác những gì tôi muốn nhận được; thật không may, tôi không tìm cách để có được cả hai phần của số của tôi là bmp::int128_t - ví dụ-- hoặc dữ liệu cơ bản về số của tôi.

Đó là, tôi thích một cái gì đó như thế này tồn tại:

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

hoặc

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

Dù sao, không ai biết làm thế nào để làm những gì tôi đang cố gắng để đạt được?

Để lưu bản ghi, tôi cần điều này để biểu thị số thập phân lớn dưới dạng số thập phân C# vì lợi ích của khả năng tương tác.

Trả lời

-1

Tôi nghi ngờ rằng bạn có thể sử dụng eval_frexp để lấy các giá trị bạn đang tìm kiếm, mặc dù bạn vẫn sẽ phải kiểm tra xem chúng có phù hợp với loại thập phân C# hay không. Xem hướng dẫn sử dụng các yêu cầu phụ trợ Boost.Multiprecision tại đây: http://www.boost.org/doc/libs/1_53_0/libs/multiprecision/doc/html/boost_multiprecision/ref/backendconc.html

Bạn luôn có thể thực hiện kiểm tra toán học và phạm vi dài hạn; nếu bạn không chuyển quá nhiều số, điều này có thể đủ nhanh.

Có nói tất cả những gì, bạn đều được chào đón để được nghịch ngợm và làm điều gì đó như:

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

Nhưng nếu nó phá vỡ trong một thông cáo trong tương lai, bạn có thể giữ cả hai miếng.


Xin chào, cảm ơn vì không có bình luận. Điều đó thực sự hữu ích.

Để làm rõ ý kiến ​​của tôi trên:

Sử dụng eval_frexp: sau khi nghiên cứu sâu hơn, có vẻ như rằng eval_frexp(b, cb, pi) vẫn chỉ cung cấp lũy thừa của 2, chứ không phải quyền hạn của 10 là dường như được yêu cầu cho các loại Decimal. Vì vậy, tôi nghi ngờ rằng bạn phải làm số học ở dạng dài nếu bạn chỉ muốn sử dụng giao diện công cộng.

Lạm dụng private thành viên: Các tác giả và người duy trì các lớp Boost.Multiprecision đã thiết kế chúng theo các nguyên tắc nhất định; họ dường như xếp hạng việc kiểm soát tương lai là quan trọng hơn việc cung cấp quyền truy cập vào cấu trúc bên trong:

Mẫu lớp cpp_dec_float đáp ứng tất cả các yêu cầu cho loại phụ trợ. Các thành viên của nó và các chức năng không phải là thành viên được cố tình không ghi lại: đây được coi là chi tiết triển khai có thể thay đổi. (http://www.boost.org/doc/libs/1_53_0/libs/multiprecision/doc/html/boost_multiprecision/ref/cpp_dec_ref.html)

đề nghị của tôi, được đánh dấu rõ ràng là "nghịch ngợm" và với sự cảnh báo rằng nó có khả năng sẽ phá vỡ trong một thông cáo trong tương lai, đã áp đặt những nhu cầu thiết kế của OP trước những tác giả của B.MP.

Phương pháp rất sạch sẽ nhất là đề xuất thay đổi đối với lớp cpp_dec_float, nơi cấu trúc bên trong bị lộ ra; đưa ra một trường hợp sử dụng thuyết phục và phân tích về số lượng mã đã có hoặc không thay đổi trong lịch sử, nó thậm chí có thể được chấp nhận.

Hy vọng điều này sẽ hữu ích. Nếu độc giả vẫn có vấn đề với nó, xin vui lòng để downvote, nhưng xin vui lòng cho tôi biết phần nào làm phiền bạn vì vậy tôi có thể cố gắng để cải thiện nó.

+0

Đó không phải là tôi , nhưng '# define'ing từ khóa là hành vi không xác định và (gần như?) không bao giờ là một giải pháp vững chắc cho các vấn đề –

+0

Ồ, không có đối số ở đó. Tôi đã cố gắng để cụm từ trả lời ban đầu (và nhận xét của tôi snarky về downvote) để được rõ ràng rằng đây không phải là một cái gì đó là một ý tưởng tốt cho việc sử dụng sản xuất. Nếu OP thực sự cần khả năng này lâu dài, thì nếu họ không thể thuyết phục những người bảo trì B.MP, họ chỉ nên nĩa nó và hút nó vào cơ sở mã của họ - BPL cho phép điều đó. Tôi chỉ cố gắng cung cấp một giải pháp "đó là 11 giờ tối và bạn cần nó vào ngày mai". Có lẽ đó là giá trị một downvote, dunno. – AnthonyFoiani

+0

Buồn cười giai thoại: Tôi đã cố gắng tạo "#define private public; NO REGRETS" meme trên bộ tạo meme nội bộ tại công ty hiện tại của tôi ... chỉ để được chuyển hướng đến một ví dụ * hiện có *. Vì vậy, tôi đoán tôi không phải là linh hồn duy nhất bị sa thải với ý tưởng này. :) – AnthonyFoiani

0

Tôi không biết nếu điều này là bạn đang tìm kiếm, hãy thử ...

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

Các loại vẫn là cpp_dec_float_100, nhưng chỉ chứa một phần số nguyên. Tôi hy vọng điều này sẽ hữu ích.

1

Từ tài liệu hướng dẫn tăng, mặt sau bị cố ý mờ đục vì nó có thể thay đổi bất cứ lúc nào mà không cần cảnh báo. (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.) từ http://www.boost.org/doc/libs/1_55_0/libs/multiprecision/doc/html/boost_multiprecision/ref/cpp_dec_ref.html

Theo tôi có thể thấy bạn có hai lựa chọn tại đây. Bạn có thể xem mã nguồn cho phiên bản cụ thể của lớp phụ trợ bạn đang sử dụng, truy cập phiên bản number bằng cách sử dụng phương thức backend và hy vọng rằng chương trình phụ trợ không bao giờ thay đổi (đặc biệt xem xét các thay đổi chỉ phá vỡ định dạng nhị phân và không biên dịch) .

Cách khác tôi sẽ khuyên bạn thực hiện chuỗi đại diện của cpp_dec_float và chia nó thành hai phần chính mình, bằng cách sử dụng string hoặc char* nhà xây dựng cho các loại không thể thiếu tiềm ẩn mà bạn quan tâm.

+0

+1, với lưu ý bổ sung rằng giấy phép công cộng Boost cho phép sao chép hầu như bất kỳ việc sử dụng nào, bao gồm cả thương mại. Nếu các đại diện nội bộ nếu một số phiên bản là chính xác những gì OP cần/muốn, sau đó nếu chủ Boost.MultiPrecision không thể bị thuyết phục để đóng băng một thực hiện, OP có thể đóng băng nó mình. – AnthonyFoiani

Các vấn đề liên quan