将大于 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+4932
和 long double
。 2.79654E+25678
和 3.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中double的取值范围为1.79E308。E308是啥意思?
请教c#中double类型转化为long类型的方法, 以及对double四舍五入的方法