Microsoft pow
рутина, как известно, плохо.Можно вернуть правильные результаты для этих и аналогичных операндов, как демонстрирует macOS pow
, но Microsoft либо не включила инженерные работы для этого, либо решила не менять свою реализацию pow
.Даже для небольших целочисленных операндов с математическими результатами, которые представляются с плавающей точкой, pow
может возвращать результаты, которые немного больше или немного меньше, чем правильное значение.Когда возвращается результат, меньший, чем точный целочисленный результат, то его преобразование в целое число приводит к усечению до следующего более низкого целого числа.
Вычисление pow
затруднительно, и не все реализации хорошо справляются со своей задачей.Для функций с плавающей запятой теоретически наилучшее возможное качество равно правильно округлено .Правильно округленная процедура возвращает число, представимое в формате с плавающей запятой, которое ближе всего к точному математическому результату, округленное в направлении, определяемом выбранным правилом округления.(Наиболее часто используемое правило округления заключается в округлении до ближайшего значения с привязкой к четной младшей цифре. Другие правила включают округление в направлении + ∞, в направлении −∞ и в направлении нуля.) Очень трудно вычислить pow
справильное округление, и ни одна коммерческая или широко используемая реализация, о которой я знаю, не делает этого.
Тем не менее, можно спроектировать pow
так, чтобы он возвращал точный результат всякий раз, когда точный результат представляется в плавающемформат точки.Насколько я помню, текущая реализация macOS
pow делает это.Таким образом, рассматриваемая программа при компиляции и исполнении с помощью инструментов macOS даст ожидаемые результаты.pow
от Microsoft не имеет этого свойства, поэтому вычисления pow(x, 3)
могут возвращать значение, немного меньшее x 3 , даже если x 3 представимо.
Даже если используется высококачественная реализация pow
, обычно желательно не использовать pow
с малыми целочисленными степенями по соображениям скорости.Вычисление pow(x, 3)
медленнее, чем вычисление x*x*x
.