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