6.1.2.10 Math
Note
This section describes the implementation of MS-VBAL §6.1.2.10 Math.
The Math module is represented in the SDK by the interface
IStdMathModule.
The Math module's declarations follow MS-VBAL's own Function Declaration blocks (MS-VBAL §6.1.2.10),
declaration by declaration, including their return types and their Optional parameters.
The specification says little more of these functions than what each one computes: the type of most results, the
errors, and the whole of Rnd and Randomize are left to the implementation. RD-VBA does what MS-VBA does, recorded
in Excel (64-bit, en-US), and the notes below say what that is.
An argument declared Double is Let-coerced to Double by the call, before the function sees it: Null is error 94,
a string that is not a number is error 13, and Empty is 0. An object, given to any parameter, is read as its
simple data value - what its default member returns - as for the Conversion module
(RD-VBAL §6.1.2.3 An object argument): Abs of an
object whose default member returns Null is Null, and Nothing is error 91.
6.1.2.10.1 Public Functions
Note
This section describes the implementation of MS-VBAL §6.1.2.10.1 Public Functions.
| § | Member | Notes |
|---|---|---|
| 6.1.2.10.1.1 | Abs | The result has the type of the argument: a Date stays a Date, and a Boolean is an Integer (Abs(True) is 1). The smallest value of a type has no absolute value of that type, and is error 6 - except for a Long: 👉 MS-VBA answers Abs of the smallest Long with that same negative Long, and so does RD-VBA. Integer, LongLong and Currency overflow. 🎯 The call itself is of the argument's declared type when that is a number, as MS-VBA types it where the specification declares As Variant: Abs(n) * 7000 of an Integer is an Integer product, which overflows (RDC11018). |
| 6.1.2.10.1.2 | Atn | |
| 6.1.2.10.1.3 | Cos | An angle of 263 radians or more, either sign, is error 5. 👉 Otherwise the result is the platform's, within a unit of the last place of the true value as MS-VBA's is, and MS-VBA's to the last bit for all but about one argument in forty (recorded in Excel, oracle\s43: Cos(1) is one). |
| 6.1.2.10.1.4 | Exp | "An error occurs" is error 6: the result would be greater than the largest Double. |
| 6.1.2.10.1.5 | Log | A number not greater than zero is error 5. |
| 6.1.2.10.1.6 | Rnd | MS-VBA's generator, so that a seeded sequence is MS-VBA's: a 24-bit linear congruential generator (×&H43FD43FD, +&HC39EC3, modulo 224) whose state is the last number it generated. A negative number seeds it with the bits of the Single it is. Its state is the session's (ISessionRandomNumberGenerator), and starts where a new MS-VBA process does: the first Rnd is 0.7055475. An End resets it with the rest of the session. The argument is Let-coerced to Single. |
| 6.1.2.10.1.7 | Round | A tie rounds to even. A Double is scaled to the digits it keeps, rounded, and scaled back, so a tie is a tie as the scaled Double is: Round(2.345, 2) is 2.35, and Round(1.005, 2) is 1. A Currency and a Decimal round as the decimal numbers they are (Round(CCur(2.345), 2) is 2.34). The result has the type of the argument, a Boolean as an Integer; a String is Let-coerced to Double. A negative number of digits is error 5, Null included. More than 22 digits is error 5 for anything rounded as a Double (a Single, a Date, a String); a whole number, a Currency and a Decimal take any number of digits. A Currency rounded past the largest one is error 6. Round(-0.5) is a negative zero, -0. |
| 6.1.2.10.1.8 | Sgn | An Integer, of any number, Date, Boolean or numeric String. Null is error 94. |
| 6.1.2.10.1.9 | Sin | As Cos. |
| 6.1.2.10.1.10 | Sqr | A negative number is error 5; the square root of 0 is 0. |
| 6.1.2.10.1.11 | Tan | As Cos. The tangent is MS-VBA's: the sine over the cosine, divided in 80 bits — the platform's own tangent differs from it in the last bit for one argument in three. |
6.1.2.10.2 Public Subroutines
Note
This section describes the implementation of MS-VBAL §6.1.2.10.2 Public Subroutines.
| § | Member | Notes |
|---|---|---|
| 6.1.2.10.2.1 | Randomize | The argument is Let-coerced to Double, and the high half of its bits is folded into the upper two bytes of the generator's state; the low byte stays what it was, so what follows depends on where the generator was. An omitted argument seeds it from the session's clock (Timer). 👉 The specification seeds from the timer for Empty too; MS-VBA Let-coerces Empty like any other argument, to 0, and RD-VBA does what MS-VBA does. |
⏮️ RD-VBAL §6.1.2.9 KeyCodeConstants | ⏭️ RD-VBAL §6.1.2.11 Strings