On Saturday, 13 January 2018 at 18:37:10 UTC, kdevel wrote:

I get large numerical dicrepancies and an exception:

That's because you are mixing floating point and decimal.

Just to take one example: double 1.1 cannot be represented exactly as floating point and it's in fact 1.10000002384185791015625.

sin is calculated using a Taylor series: sin(x) = x - x^3/3! + x^5/5! - x^7/7! ... and so on. Raising to power all that junk after 1.1 will lead finally to error. If you really want to find out sin(1.1) using decimal, try sin(decimal128("1.1")) or sin(decimal128(1)/10);

For exact values like sin(1.0), I let you decide which one is more exact:

Wolfram Alpha: 0.8414709848078965066525023216302989
real:          0.8414709848078965066645910000000000
double:        0.8414709848078965048700000000000000
float:         0.8414709568023681640600000000000000
decimal128:    0.8414709848078965066329679978908351
decimal64:     0.8414709848078965000000000000000000
decimal32:     0.8414710000000000000000000000000000

Anyway, I wouldn't call a difference at the 18th digit a "large discrepancy" when we are talking about irrational numbers.

Regarding the exception, I cannot reproduce it, but I'll look into it.

Thank you for your exhaustive testing :)

Reply via email to