使用Double(Excel)的VBA溢出错误

使用Double(Excel)的VBA溢出错误,excel,vba,double,overflow,rsa,Excel,Vba,Double,Overflow,Rsa,出于某种原因,以下语句的计算结果为零。我假设这是由于溢出,但所有的中间值似乎都在double的限制范围内 DiffieHellmanKey = (43 ^ 47) - (53 * Fix((43 ^ 47) / 53)) 我认为它是溢出的,因为当我用不同的数字(如下)执行它时,它会得到正确的值29 DiffieHellmanKey = (5 ^ 22) - (53 * Fix((5 ^ 22) / 53)) 有什么好处?现在,回到原来的数字,让我溢出。所有涉及的变量都是双变量。如果我将其计算

出于某种原因,以下语句的计算结果为零。我假设这是由于溢出,但所有的中间值似乎都在double的限制范围内

DiffieHellmanKey = (43 ^ 47) - (53 * Fix((43 ^ 47) / 53))
我认为它是溢出的,因为当我用不同的数字(如下)执行它时,它会得到正确的值29

DiffieHellmanKey = (5 ^ 22) - (53 * Fix((5 ^ 22) / 53))
有什么好处?现在,回到原来的数字,让我溢出。所有涉及的变量都是双变量。如果我将其计算为工作表公式而不是在VBA中,它甚至不起作用:

=(43 ^ 47) - (53 * ROUNDDOWN(((43 ^ 47) / 53), 0))
如果我在VBA中使用等价形式(如下)实现上面的示例,我会得到一个不正确的结果-1.75357E+62

DiffieHellmanKey = (43 ^ 47) - (53 * WorksheetFunction.RoundDown(((43 ^ 47) / 53), 0))

您是对的,但您的问题不是溢出,而是有效数字

Microsoft Excel中的数字不能超过15位有效数字,但小数可以大到127位。

资料来源:

这就是您原来的配方所发生的情况:

(43^47)-(53*Fix((43^47)/53))
简化为
(43^47)-Fix(43^47)
然后(43^47)有大约76个数字长,所以它们都被减少到相同的数量,等于0


VBA中最大的变量类型是“Decimal”,它只包含29位有效数字。您将无法使用visual basic本机执行如此大的数学运算。

我在一些示例中切换了数字,抱歉。修正了。我看了你的第一个例子,但在我看来还是一样的。你认为结果会是什么?它应该评估为29。这是基本的RSA加密,所以上面的四个例子都应该给出29。只有第二个(较小的数字)起作用。我想你正在挑战VBA中双精度的极限(大约15位?)你可以在VB(A)中做这种事情,但它需要将所需的大整数作为字符串处理:我理解这里的逻辑,但对我来说你的固定函数:(.43^47)-(53*Fix)((.43 ^ 47) / 53))*10000的计算结果是5.92949097309764E-18,而不是29。进行了一些双重检查,发现即使是我的答案也达到了最大值。尝试了其他一些方法,最终得到了上面的答案。底线是,对于您的示例,我们需要高达74位的精度,VBA中的变量没有一个达到那么高的精度。好的,谢谢。那么字符串将是正确的这似乎是一个很好的方法。我想知道VBA中是否有一个解决方案来执行这么大的计算。我的猜测是,你应该能够制作一个包含300位数字0-9的数组,并将其用作一个大变量。然后在它上编写执行数学函数的函数。
? (43^47) 
 5.92949097309764E+76

? 53*Fix((43^47)/53)
 5.92949097309764E+76 

? (53*Fix((43^47)/53)) = (43^47)
True