Spurred on by Armada's excellent videos, I decided to try and figure out the full attack speed formula.
WAPS = (Base_APS * (1 + WIAS) + WBonus_APS)
WAPS = Weapon Attacks Per Second (the value displayed on the weapon itself) Base_APS = base APS of the weapon before any modifiers WIAS = Weapon Increased Attack Speed (+% attack speed on the weapon itself) WBonus_APS = Weapon Bonus APS (flat +attacks per second on the weapon itself)
APS = (WAPS + OBonus_APS) * (1 + OIAS)
APS = Attacks Per Second (final value) OBonus_APS = Other Bonus APS (flat +attacks per second from other gear *including the other weapon*) OIAS = Other Increased Attack Speed (+% attack speed from non-weapon gear)
The final numbers are rounded to the nearest hundredth for display with decimals ending in "5" rounding down rather than up.
Giving the stats simpler names results in the formulas at the top of the post.
I did some additional in-game testing to determine if the dual wielding bonus was additive or multiplicative with other sources of IAS, and it definitely looks to be additive. In addition, decimals were being rounded to the nearest hundredth except for those ending in a 5 being rounded down rather than up. This is almost certainly due to binary floating point values representing these numbers as ending in 49999 instead of 5.
I didn't test frenzy shrines or IAS from skills like Frenzy, but I would imagine that these values are also added into the OIAS value rather than applies multiplicatively.