[英]Is there a built in way to do non floating point decimal operations in c++?
[英]How to do 32 digit decimal floating point number multiplication in C++?
我有兩個數字,它們是32位十進制浮點數,例如1.2345678901234567890123456789012,我想獲得也是32位十進制浮點數的乘法。 有什么有效的方法可以做到這一點嗎?
只需使用boost::multiprecision
。 您可以使用任意精度,但是有一個typedef
cpp_bin_float_50
,它是一個帶有50個小數位的float
。
乘以大十進制數字的示例:
#include <iostream>
#include <boost/multiprecision/cpp_bin_float.hpp>
int main(){
boost::multiprecision::cpp_bin_float_50 val1("1.2345678901234567890123456789012");
boost::multiprecision::cpp_bin_float_50 val2("2.2345678901234567890123456789012");
std::cout << std::setprecision(std::numeric_limits< boost::multiprecision::cpp_bin_float_50>::max_digits10);
std::cout << val1*val2 << std::endl;
}
輸出:
2.7587257654473404640618808351577828416864868162811293
使用通常的小學算法(長乘法)。 如果您使用3個整數(而不是4個):
A2A1A0 * B2B1B0 = A2*B2 A2*B1 A2*B0
A1*B2 A1*B1 A1*B0
A0*B2 A0*B1 A0*B0
每次乘法都會得到2整數的結果。 您必須對右側的每一列求和,並傳播進位。 最后,您將得到一個6整數的結果(如果輸入為4整數,則結果為8整數)。 然后,您可以舍入該8位數的結果。 這就是處理尾數部分的方式。 指數應只加在一起。
我建議您將問題分為兩個部分:
您將需要像下面這樣的工作(注意,此代碼假定int是32位,long long是64位):
void wideMul(unsigned int &hi, unsigned int &lo, unsigned int a, unsigned int b) {
unsigned long long int r = (unsigned long long int)a*b;
lo = (unsigned int)r;
hi = (unsigned int)(r>>32);
}
注意:如果您的數字較大,則可以使用更快的算法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.