Я выполнил тот же тест и получил те же результаты, 10103 различий из 10000000. Это было использование Python 2.7 в Windows.
Разница только в округлении. Я считаю, что когда два результата различаются, это только один ULP , который является наименьшей возможной разницей для поплавка. Истинный ответ лежит между ними, но у float
нет возможности точно представить его, и оно должно быть округлено.
Как отмечено в другом ответе, модуль decimal
может использоваться для получения большей точности, чем float
. Я использовал это, чтобы лучше понять истинную ошибку, и во всех случаях sqrt
был ближе, чем **0.5
. Хотя ненамного!
>>> s1 = sqrt(8885558)
>>> s2 = 8885558**0.5
>>> s3 = decimal.Decimal(8885558).sqrt()
>>> s1, s2, s3
(2980.865310610327, 2980.8653106103266, Decimal('2980.865310610326787899635293'))
>>> s3 - decimal.Decimal(s1)
Decimal('-2.268290468226740188598632812E-13')
>>> s3 - decimal.Decimal(s2)
Decimal('2.2791830406379010009765625E-13')