При использовании с дробными показателями pow(x,y) обычно оценивается как exp(log(x)*y)
; такая формула была бы математически правильной, если бы оценивалась с бесконечной точностью, но на практике может привести к ошибкам округления. Как уже отмечалось, значение 9999,999999999 при приведении к целому числу даст 9999. Некоторые языки и библиотеки постоянно используют такую формулировку при использовании оператора возведения в степень с показателем с плавающей запятой; другие пытаются определить, когда показатель степени является целым числом, и при необходимости используют итерированное умножение. Просматривая документацию по функции pow
, оказалось, что она должна работать, когда x
отрицательное, а y
не имеет дробной части (когда x
отрицательное, а `y
четное, результат должен быть pow(-x,y)
; когда y
нечетный, результат должен быть -pow(-x,y)
Казалось бы логичным, что, когда y
не имеет дробной части, библиотека, которая собирается столкнуться с проблемой работы с отрицательным значением x
, должна использовать итерированное умножение, но я не знаю какой-либо спецификации, диктующей это.
В любом случае, если вы пытаетесь возвести целое число в степень, почти наверняка лучше использовать математику целых чисел для вычисления или, если целое число, которое нужно возвести, является константой или всегда будет маленьким, просто используйте таблицу поиска. (возведение чисел от 0 до 15 в любую степень, которая уместилась бы в 64-битном целом числе, потребовало бы только таблицы из 4096 элементов).
person
supercat
schedule
14.03.2012
sections
и как он инициализируется? - person pmdj   schedule 14.03.2012