Я пишу (почти) IEEE 854-совместимую реализацию с плавающей запятой в TeX (которая поддерживает только 32-битные целые числа). Этот стандарт определяет только результат +
, -
, *
, /
, сравнение, остаток и sqrt
]: для этих операций результат должен быть идентичен округлению точного результата до представимого числа (в соответствии с режимом округления).
Кажется, я припоминаю, что IEEE указывает, что трансцендентные функции ( sin
, exp
...) должны давать точные результаты (в режиме округления до ближайшего по умолчанию они должны выводить одно из двух представимых чисел, окружающих точный результат). Вычислить синус малых чисел довольно просто: сдвиньте кратное 2 * пи, чтобы получить число в диапазоне [0,2 * пи], затем проделайте еще немного работы, чтобы уменьшить диапазон до [0, пи / 4] , и используйте ряд Тейлора.
Теперь предположим, что я хочу вычислить sin (1e300). Для этого мне нужно найти 1e300 по модулю 2 * pi. Для этого необходимо знать 300 (316?) Десятичных знаков числа пи, потому что с 16 десятичными знаками результат не будет иметь никакого значения (в частности, он не может быть точным).
Есть ли стандарт того, какой результат будет sin (1e300)
и подобные очень большие числа должны быть?
Что делают другие реализации с плавающей запятой?