s1 всегда будет равно s2.
Стандарты C и C ++ мало говорят о точности математических процедур. В буквальном смысле невозможно реализовать стандарт, поскольку стандарт C говорит, что sqrt (x) возвращает квадратный корень из x, но квадратный корень из двух не может быть точно представлен в плавающей запятой.
Реализация подпрограмм с хорошей производительностью, которые всегда возвращают правильно округленный результат (в режиме округления к ближайшему это означает, что результатом является представимое число с плавающей запятой, которое является ближайшим к точному результату, причем связи разрешаются в пользу низкий нулевой бит) - сложная исследовательская задача. Хорошие математические библиотеки нацелены на точность менее 1 ULP (поэтому возвращается одно из двух ближайших представимых чисел), возможно, немного больше, чем .5 ULP. (ULP - это единица наименьшей точности, значение младшего бита, заданное конкретным значением в поле экспоненты.) Некоторые математические библиотеки могут быть значительно хуже этого. Вам нужно будет обратиться к поставщику или проверить документацию для получения дополнительной информации.
Так что sqrt может быть немного отключен. Если точный квадратный корень является целым числом (в пределах диапазона, в котором целые числа точно представимы в плавающей точке), и библиотека гарантирует, что ошибки меньше 1 ULP, то результат sqrt должен быть точно правильным, потому что любой результат, отличный от Точный результат не менее 1 ULP.
Аналогично, если библиотека гарантирует, что ошибки меньше 1 ULP, ceil должен вернуть точный результат, опять же, потому что точный результат представим, а любой другой результат будет по крайней мере на 1 ULP. Кроме того, природа ceil такова, что я ожидаю, что любая разумная математическая библиотека всегда будет возвращать целое число, даже если остальная библиотека была не высокого качества.
Что касается случаев переполнения, если ceil (x) был вне диапазона, в котором все целые числа точно представимы, то ceil (x) +. 1 ближе к ceil (x), чем к любому другому представимому числу, поэтому округленный результат добавления .1 к ceil (x) должен быть ceil (x) в любой системе, реализующей стандарт с плавающей запятой (IEEE 754). Это при условии, что вы находитесь в режиме округления по умолчанию, который округляется до ближайшего. Можно изменить режим округления на что-то вроде округления до бесконечности, что может привести к тому, что ceil (x) +. 1 будет целым числом выше, чем ceil (x).