Почему не 'международная голова (международная основа, международная экспонента)' в стандартных библиотеках C++?

Я чувствую, что должен просто не мочь найти его. Есть ли любая причина что C++ pow функция не реализует функцию "питания" ни для чего кроме floats и doubles?

Я знаю, что реализация тривиальна, я просто чувствую, что делаю работу, которая должна быть в стандартной библиотеке. Устойчивая функция питания (т.е. переполнение дескрипторов некоторым последовательным, явным способом) не является забавой записать.

106
задан phuclv 5 September 2019 в 01:32
поделиться

3 ответа

Потому что в любом случае невозможно представить все целочисленные степени в int:

>>> print 2**-4
0.0625
10
ответ дан 24 November 2019 в 03:52
поделиться

Возможно, потому что ALU процессора не реализовал такую ​​функцию для целых чисел, но есть такая инструкция FPU (как указывает Стивен, на самом деле это пара ). Таким образом, на самом деле было быстрее выполнить приведение к удвоению, вызвать pow с числами удвоения, затем проверить переполнение и вернуть, чем реализовывать это с помощью целочисленной арифметики.

(с одной стороны, логарифмы уменьшают степень умножения, но логарифмы целых чисел теряют большую точность для большинства входных данных)

Стивен прав, что на современных процессорах это уже не так, но стандарт C, когда математика функции были выбраны (C ++ просто использовал функции C) что теперь, 20 лет?

2
ответ дан 24 November 2019 в 03:52
поделиться

Для любого целочисленного типа фиксированной ширины почти все возможные входные пары в любом случае переполняют тип. Какая польза от стандартизации функции, которая не дает полезного результата для подавляющего большинства ее возможных входов?

Вам в значительной степени нужен большой целочисленный тип, чтобы сделать функцию полезной, а большинство больших целочисленных библиотек предоставляют функция.


Редактировать: В комментарии к вопросу static_rtti пишет: «Большинство входных данных вызывают его переполнение? То же самое верно для exp и double pow, я не вижу, чтобы кто-то жаловался». Это неверно.

Оставим в стороне exp , потому что это не относится к делу (хотя на самом деле это сделало бы мой аргумент более убедительным), и сосредоточимся на double pow (double x, double y) . Для какой части пар (x, y) эта функция делает что-то полезное (т.е., а не просто переполнение или потеря значимости)?

На самом деле я собираюсь сосредоточиться только на небольшой части входных пар, для которых pow имеет смысл, потому что этого будет достаточно, чтобы доказать мою точку зрения: если x положительно и | y | <= 1, то pow не переполняется или не выходит за пределы. Это составляет почти четверть всех пар с плавающей запятой (ровно половина чисел с плавающей запятой, отличных от NaN, являются положительными, и чуть менее половины чисел с плавающей запятой, отличных от NaN, имеют величину меньше 1). Очевидно, что существует много других входных пар, для которых pow дает полезные результаты, но мы убедились, что это не менее четверти всех входных пар.

Теперь давайте посмотрим на целочисленную степенную функцию фиксированной ширины (т. Е. Не bignum). Для какой порции входов просто не переполняется? Чтобы максимизировать количество значимых входных пар, основание должно быть подписано, а показатель степени - без знака. Предположим, что основание и экспонента имеют ширину n бит. Мы можем легко определить ту часть входных данных, которая имеет смысл:

  • Если показатель степени 0 или 1, то любое основание имеет смысл.
  • Если показатель степени равен 2 или больше, то никакое основание больше 2 ^ (n / 2) не дает значимого результата.

Таким образом, из входных пар 2 ^ (2n) менее 2 ^ (n + 1) + 2 ^ (3n / 2) дают значимые результаты. Если мы посмотрим на наиболее распространенное использование 32-битных целых чисел, это означает, что что-то порядка 1/1000 одного процента входных пар не просто переполняется.

41
ответ дан 24 November 2019 в 03:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: