@sascha Относительно второго вопроса: относительная ошибка, то есть (правильная - приблизительная) / правильная, должна быть в этом диапазоне. Для вашего примера, относительная ошибка 6,8533701764037842e-17.

отаю над портированиемsqrt функция (для 64-битных пар)fdlibm к инструменту проверки моделей, который я использую в данный момент (CBMC).
В ходе своей работы я много читал о стандарте ieee-754, но, по-моему, я не понимал гарантии точности основных операций (в том числе sqrt).

Тестируя мой порт sqrt fdlibm, я получил следующий расчет с sqrt на 64-битном двойном:

sqrt(1977061516825203605555216616167125005658976571589721139027150498657494589171970335387417823661417383745964289845929120708819092392090053015474001800648403714048.0) = 44464159913633855548904943164666890000299422761159637702558734139742800916250624.0

(этот случай нарушил простое постусловие в моем тесте относительно точности; я больше не уверен, возможно ли это постусловие с IEEE-754)

Для сравнения, несколько инструментов с высокой точностью вычислили что-то вроде:

sqrt(1977061516825203605555216616167125005658976571589721139027150498657494589171970335387417823661417383745964289845929120708819092392090053015474001800648403714048.0) =44464159913633852501611468455197640079591886932526256694498106717014555047373210.truncated

Видно, что 17-е число слева отличается, что означает ошибку вроде:

3047293474709469249920707535828633381008060627422728245868877413.0

Вопрос 1: допускается ли это огромное количество ошибок?

Стандарт гласит, что каждая базовая операция (+, -, *, /, sqrt) должна быть в пределах 0,5 ulps, что означает, что она должна быть равна математически точному результату, округленному до ближайшего fp-представления (вики говорят, что некоторые библиотеки гарантирует только 1 ulp, но это не так важно в данный момент).

Вопрос 2. Означает ли это, что каждая базовая операция должна иметь ошибку <2.220446e-16 с 64-разрядными двойными числами (machine-epsilon)?

Я рассчитал то же самое с системой Linux x86-32 (glibc / eglibc) и получил тот же результат, что и с fdlibm, что позволило мне подумать, что:

я сделал что-то не так (но как:printf был бы кандидатом, но я не знаю, может ли это быть причиной)б: ошибка / точность распространена в этих библиотеках

Ответы на вопрос(2)

Ваш ответ на вопрос