Насколько неправильно я использую функцию Math.Pow (a, b) в этом коде C #? - PullRequest
1 голос
/ 18 января 2011

Я не могу найти ничего плохого в следующем коде, откуда компилятор MSVC # сохраняет NAN в "c":

double c = Math.Pow(-8d, 1d / 3d);

Хотя я думаю, что эта строка должна вычислять -2 для "c"компилятор хранит NAN в "с"?Я что-то не так делаю?

Ответы [ 3 ]

7 голосов
/ 18 января 2011

Степенная функция для чисел с плавающей запятой определяется только для положительной базовой или интегральной степени. Попробуйте

double c = - Math.Pow(8d, 1d / 3d);

На самом деле, 1/3 не может быть представлена ​​точно как число с плавающей запятой, но должно быть округлено. Точного реального результата для округленного показателя в теории даже не существует.

5 голосов
/ 18 января 2011

Обычно никто бы не сказал, что (-8) ^ (1/3) = -2.

Действительно, верно, что (-2) ^ 3 = -8, но степени отрицательных чисел - сложный вопрос.

Подробнее о проблеме можно прочитать в Википедии :

Ни метод логарифма, ни может быть использован метод рационального показателя определить ^ r как действительное число для отрицательное действительное число а и произвольное действительное число r. Действительно, это положительное для каждого действительного числа г, так ln (a) не определяется как действительное число для ≤ 0. (С другой стороны, произвольные сложные степени отрицательных числа могут быть определены путем выбора комплексный логарифм а.)

Короче говоря, математически трудно правильно определить, каким должен быть ^ r, когда a отрицательно, чтобы не начать работать с комплексными числами, и поэтому вообще следует избегать попыток сделать это.

3 голосов
/ 18 января 2011

Ответ - комплексное число: 1.0+1.732050807568877i.Класс .NET Math не поддерживает комплексные числа.

...