簡體   English   中英

如何在C ++中進行32位十進制浮點數乘法?

[英]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位數的結果。 這就是處理尾數部分的方式。 指數應只加在一起。

我建議您將問題分為兩個部分:

  1. 將整數與整數相乘
  2. 將結果從1.添加到最終結果

您將需要像下面這樣的工作(注意,此代碼假定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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM