使用双打不正确的VBA溢出(Excel)

时间:2012-10-19 00:39:48

标签: excel vba double overflow rsa

由于某种原因,以下语句的计算结果为零。我认为这是由于溢出,但所有临时值似乎都在双倍的范围内。

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))

2 个答案:

答案 0 :(得分:1)

? (43^47) 
 5.92949097309764E+76

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

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

答案 1 :(得分:1)

你是对的,但你的问题不在于溢出,而在于有效数字。

Microsoft Excel中的数字永远不会超过15位有效数字,但小数位数可以达到127位。

来源:http://msdn.microsoft.com/en-us/library/office/ff838588.aspx

这是你原始公式发生的事情:

(43 ^ 47) - (53 * Fix((43 ^ 47) / 53))简化为(43 ^ 47) - fix(43 ^ 47) 那么(43 ^ 47)有大约76位数字,所以它们都被削减到相同的数量并等于0。

VBA中最大的变量类型是“十进制”,它只包含29位有效数字。你无法使用visual basic本地执行这么大的数学运算。