On Jun 8, 2018, at 5:47 AM, KHMan <email@example.com> wrote:
Operation / Op_Count / Diff_Count
A+B 1,000,000,000 0
A-B 1,000,000,000 0
A*B 1,000,000,000 243,584
A/B 1,000,000,000 244,107
For A*B and A/B, this is roughly 1 in 4000.
All different results differ by 1 ULP. Nothing more than 1 ULP was seen.
I found another blog doing the same test, error also about 1:4000
Just some math behind the observation:
Double rounding occurs when both rounded in the same direction.
Difference between 53-bits and 64-bits are 11-bits.
--> chances of same direction rounding is about 50%
--> chances of double rounding = 50% / 2^11 = 1 / 4096
With just 1 op, of course the error is at most 1 ULP
Operation : *
Here are the hex representations of the significands:
fpu8087 = 7e65b9c2a810e
binary128 = 7E65B9C2A810E5EAB7A33195161D
fpu64bit = 7e65b9c2a810f
Using this comparison, it appears that the binary128 result is nearer to fpu8087 than to fpu64bit. We can also verify this by getting a more accurate decimal version of the 64-bit binary representation (done by manual fiddling, so not definitive):
You do realize we have to work in 53-bits for comparison.
Getting more precise result with more bits does not show anything.
My guess is you set (n1, n2) as decimal string -> __float128.
Had you use the actual hexfloats, you should get this:
n1 * n2
= 0x1.84daa65360288p-3 * 0x1.f77f9cd91528bp-1
= 0x1.7e65b9c2a810e 800eb4c1577ec p-3
--> value should round-up, to 0x1.7e65b9c2a810fp-3
--> 53-bits rounding is doing the best it can with 2 doubles.