2

何らかの理由で、次のステートメントはゼロに評価されます。オーバーフローが原因だと思いますが、すべての中間値は double の範囲内にあるようです。

DiffieHellmanKey = (43 ^ 47) - (53 * Fix((43 ^ 47) / 53))

異なる数値(以下)で実行すると、正しい値が29になるため、オーバーフローだと思います。

DiffieHellmanKey = (5 ^ 22) - (53 * Fix((5 ^ 22) / 53))

何を与える?ここで、オーバーフローを引き起こしている元の数値に戻ります。関連する変数はすべて Double です。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 で最大の変数型は 'Decimal' で、有効桁数は 29 桁しかありません。Visual Basic をネイティブに使用して、このような大規模な計算を実行することはできません。

于 2012-10-19T01:25:22.997 に答える