如何在.NET中执行具有大长结果的Power?

如何在.NET中执行具有大长结果的Power?,.net,math,.net,Math,最近,我正在尝试解决程序中的一个错误,并意识到问题出在下面的代码中(类型不是字节,但对于这个问题,假设它们不能大于字节,因为某些组合可能导致溢出): 给定示例值:x=27,y=12,z=7 然后: 但是,C#.NET代码将给出: a = 27 ^ 12 = 150,094,635,296,999,136 r = a * 7 = 1,050,662,447,078,993,952 线索在Math.Pow函数中,它将返回表示为: 1.5009463529699914E+17 这是因为Math.P

最近,我正在尝试解决程序中的一个错误,并意识到问题出在下面的代码中(类型不是字节,但对于这个问题,假设它们不能大于字节,因为某些组合可能导致溢出):

给定示例值:x=27,y=12,z=7

然后:

但是,C#.NET代码将给出:

a = 27 ^ 12 = 150,094,635,296,999,136
r = a * 7 = 1,050,662,447,078,993,952
线索在Math.Pow函数中,它将返回表示为:

1.5009463529699914E+17
这是因为Math.Pow函数只存在于double中,并且double的不精确程度超过了某个分数。由于结果越来越接近long.MaxValue,因此不精确的浮点数学将影响由强制转换产生的long值

对于long,没有等效的Math.Pow函数。有些东西告诉我这个借口是因为在引擎盖下,long和double是64位的数字,不管你如何表达它们。然而(在我看来)朗斯不应该使用浮点数学

这是否意味着CPU无法使用32位以上的非小数值执行精确计算?这对我来说似乎是极不可能的,因为Windows计算器可以正确地计算出这个数学

像这样的问题应该如何在.NET中解决?我有点假设我错过了某个函数

(我通过改变解决方案设计的方法解决了最初的问题,不再需要这些代码,但我想我还是会发布这个问题,因为它很有趣。)

问候,,
Rob。

您可以使用
biginger
类处理任意精度的整数。这是您的问题的标准解决方案

如果您不需要大于
long.MaxValue
的数字,也可以编写一个简单的幂函数


CPU使用固定大小的整数。任意大小的整数是一种软件解决方案。

您可以使用
biginger
类处理任意精度的整数。这是您的问题的标准解决方案

如果您不需要大于
long.MaxValue
的数字,也可以编写一个简单的幂函数


CPU使用固定大小的整数。任意大小的整数是一种软件解决方案。

啊,谢谢,我们能够重新编写原始代码,现在就可以工作了。最初的解决方案是在2005年写的,当时显然没有大整数。进度:)啊,谢谢,我们能够重新编写原始代码,这样它现在就可以工作了。最初的解决方案是在2005年写的,当时显然没有大整数。进展:)
a = 27 ^ 12 = 150,094,635,296,999,136
r = a * 7 = 1,050,662,447,078,993,952
1.5009463529699914E+17