2

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

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

2 回答 2

1
? (43^47) 
 5.92949097309764E+76

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

? (53*Fix((43^47)/53)) = (43^47)
True
于 2012-10-19T00:57:28.847 回答
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 执行这么大的数学运算。

于 2012-10-19T01:25:22.997 回答