Неправильная реализация Math.Pow () для номера NaN в .NET - PullRequest
0 голосов
/ 27 августа 2018

Почему команда Math.Pow(1.0, double.NaN) возвращает NaN вместо правильного 1.0? Я понимаю NaN как неопределенное значение (математически), которое представляет все действительные числа, включая положительные и отрицательные бесконечности. И для всех этих значений выражение всегда математически верно и равно 1,0.

например. У Python он есть, и 1**float("nan") == 1 равен True, в соответствии со IEEE стандартом:

Для любого значения y (включая NaN), если x равно +1, должно быть возвращено 1,0.

Ответы [ 4 ]

0 голосов
/ 27 августа 2018

Это желательное поведение. Вы могли бы подумать, что Math.Pow(1, double.NaN) возвращает 1 в качестве разумного выбора, и вы могли бы выдвинуть аргумент в вашу пользу, когда речь идет о строковых литералах, но, по-моему, это проваливается, когда происходит следующее:

var i = Whatever();
var d = SomeRatherDifficultOperationYouDidntImplement();
var result = Math.Pow(i, d);

Почему это должно возвращаться 1? Может быть, d быть NaN - это то, чего не должно происходить; Вы глотаете потенциальную ошибку здесь. NaN должен распространяться всегда, есть вероятность, что некоторые предыдущие вычисления где-то пошли не так.

Если у вас есть конкретный сценарий, где Math.Pow(1, double.NaN) должно быть 1, тогда используйте конкретный код для этого случая и прокомментируйте его так, чтобы было ясно, что это заданное и требуемое поведение.

0 голосов
/ 27 августа 2018

Любая операция, использующая NaN, возвращает NaN, поэтому Math.Pow(1.0, double.Nan) возвращает NaN. Это ожидаемое поведение при использовании NaN в C #.

вызов метода со значением NaN или операция со значением NaN возвращает NaN

Смотрите здесь

То, что один язык ведет себя определенным образом, не обязательно означает, что другой язык будет вести себя таким образом

РЕДАКТИРОВАТЬ: для дальнейшего использования Math.Pow(1.0, double.PositiveInfinity) дает вам один, и я думаю, что это то, что вы ищете. Ознакомьтесь с документацией на языке о том, как используется NaN. Если вы хотите использовать положительную и отрицательную бесконечности, используйте double.PostiveInfinitity или double.NegativeInfinity, так как NaN не представляет эти значения.

0 голосов
/ 27 августа 2018

Существуют определенные представления для Отрицательных и Положительных бесконечностей, поэтому, какими бы ни были NaN, они не представляют их.

Пример, приведенный в документации для выражения, которое может создать NaN, равен 0.0/0.0. Каким бы ни был результат, это , а не какое-то "неопределенное действительное число", как вы утверждали.


Вместо того, чтобы предполагать, что Math.Pow обязательно обещает следовать соглашениям другого языка или стандарта (как вы указали в своем вопросе), вы должны проверить его собственную документацию, в которой конкретно указано его поведение относительно NaN с:

Parameters        Return value
x or y = NaN.     NaN

Выше приведена первая строка таблицы в разделе замечаний. Ниже в таблице показано ниже:

Parameters                        Return value
x = 1; y is any value except NaN. 1
0 голосов
/ 27 августа 2018

NaN означает «не число», поэтому возвращение NaN мне кажется правильным.

...