由于某种原因,以下语句的计算结果为零。我认为这是由于溢出,但所有临时值似乎都在双倍的范围内。
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))
答案 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本地执行这么大的数学运算。