将大于 long double 最大限制的 2 个数字相乘 [关闭]

Posted

技术标签:

【中文标题】将大于 long double 最大限制的 2 个数字相乘 [关闭]【英文标题】:multiply 2 numbers that are bigger than maximum limit of long double [closed] 【发布时间】:2013-08-03 09:31:59 【问题描述】:

如何使用 C++/C 例如将大于最大限制的 2 个数字相乘,即 1.89731e+4932long double2.79654E+256783.89574e+35890 ...

【问题讨论】:

你的尝试在哪里?? 我想不出办法..这是一个作业问题,非常需要一个解决方案 作业应该被尝试...他们是有原因的。 你得到了科学计数法的数字。提示:你可以使用它。 【参考方案1】:

有两种可能性(C# 示例):

您可以使用 BigInteger(在您的情况下似乎效率低下,但使用高精度数字很方便)

BigInteger a = 279654 * BigInteger.Pow(10, 25678 - 5); // <- 2.79654E25678 = 279654E25678 * 1E-5
BigInteger b = 389574 * BigInteger.Pow(10, 35890 - 5); // <- 3.89574E35890 = 389574E35890 * 1E-5
BigInteger result = a * b;

您可以分别操作尾数和指数:

Double mantissaA = 2.79654;
int exponentA = 25678;

Double mantissaB = 3.89574;
int exponentB = 35890;

Double mantissaResult = mantissaA * mantissaB;
int exponentResult = exponentA + exponentB;

// Let's adjust mantissaResult, it should be in [1..10) (10 is not included) range
if ((mantissaResult >= 10) || (mantissaResult <= -10))  
  mantissaResult /= 10.0 
  exponentResult += 1; 

else if (((mantissaResult < 1) && (mantissaResult > 0)) || ((mantissaResult > -1) && (mantissaResult < 0)))  
  mantissaResult *= 10.0 
  exponentResult -= 1;  


// Let's output the result
String result = mantissaResult.ToString() + "E+" + exponentResult.ToString();

附:通常在乘法的情况下,使用 对数 和加法会更方便:

A * B -> Log(A) + Log(B)

【讨论】:

@harold:感谢您的改进;我已经编辑了代码以添加尾数调整

以上是关于将大于 long double 最大限制的 2 个数字相乘 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Java中有啥方法能使大于long 的两个数相乘???

int short long有啥区别?

Java中double的取值范围为1.79E308。E308是啥意思?

请教c#中double类型转化为long类型的方法, 以及对double四舍五入的方法

numeric 在Java中怎么定义,是啥类型的呢? float?还是double?还是long呢?

C语言的整型溢出问题 intlonglong long取值范围 最大最小值