Redone with haste as /1024 again, newest code
Haste >> FC
Float16 (1) = ((recast * haste) * fc)
Float16 (2) = recast * (haste * fc)
Code:
Spell Haste FC Observed Float16 (1) Float16 (2)
Cure III 162 1 4 4 4
Cura 162 1 25 24 24
Protectra IV 162 1 14 14 14
Protectra III 172 1 13 13 13
Stoneskin 231 1 23 22 22
Reraise 231 1 46 45 45
Freeze 150 4 34 33 34
Blizzard II 150 11 15 15 15
Blizzard 81 15 8 8 8
Newest code fixed Cure III; is now the proper 4 seconds instead of 5.
If haste and fast cast are multiplied together before applying that to the base recast, that fixes Freeze; that shows up as the correct 34 seconds.
That still leaves us with Cura, Stoneskin and Reraise as being incorrect.
If it used round-nearest instead of round-zero, all three of those would yield the correct value. However doing so would cause Cure III and Protectra IV to become incorrect again.
Another Haste vs Fast Cast comparison. Given the potential uncertainty of 1% items, rechecking at 2%.
Fast Cast 1: Loq + Prolix, 2%
Fast Cast 2: Orison Locket (5% fast cast, should be 2% recast)
Haste: Blessed Pumps, 2%
Observed:
FC1: 49
FC2: 49
Haste: 49
Well, this is interesting.
Expected value of 2% with round-zero: 48
Expected value of 2% with round-nearest: 49
Expected value of 20/1024: 49
I was expecting either for the haste to return 49 and the FC to return 48 (if haste is /1024), or for both to return 48 (if haste is /1000). Instead both return 49. This is directly contradictory to the Loq/Aero III test in terms of rounding, for the fast cast.
Looking at it, I would get the correct answer by multiplying by 98, then dividing by 100, rather than multiplying by 0.98. Reworking...
Ok, Cura III with 4% fast cast recast (Loq+Prolix+Orison Locket) should give 48 if it uses the *96/100 sequence, or 47 if it uses the *0.96 multiplier.
Observed: 48
Ok, so changing to using that form of calculation. Looking at the samples again
(1a) = ((recast * haste) * fc)
(2a) = recast * (haste * fc)
(3a) = recast * (haste * fc), haste = /1000
Code:
Spell Haste FC Observed (1a) (2a) (3a)
Cure III 162 1 4 5 4 4
Cura 162 1 25 24 24 24
Protectra IV 162 1 14 14 14 14
Protectra III 172 1 13 13 13 13
Stoneskin 231 1 23 22 22 22
Reraise 231 1 46 45 45 45
Freeze 150 4 34 33 34 33
Blizzard II 150 11 15 15 15 15
Blizzard 81 15 8 8 8 8
Cure III and Freeze are both incorrect if you do ((recast * haste) * fc), but both correct if you do (recast * (haste * fc)). Cura, Stoneskin and Reraise are all still incorrect.
Using the same parameters, but changing to /1000 leaves the results mostly the same, but Freeze goes back to incorrect. This assumes things like 231/1024 haste is just a flat 230/1000, which isn't necessarily valid, but sufficient for a quick check.