.NET 数学库函数 Math.Pow() 对负数开奇数次方结果为 NaN,算 Bug 么?

 
文章内容
[ 2013-11-02 12:00:45 | By: dwen999 ]
 
很奇怪,这应该是个很 Basic 的问题。

如果不算,为什么?
算的话,应该存在很多年了,为什么MS 不改?

是因为网上有很多变通方案吗? MS 不好意思侵权?
 
 
QR Code
请用微信 扫一扫 扫描上面的二维码,然后点击页面右上角的 ... 图标,然后点击 发送给朋友分享到朋友圈,谢谢!
分享:
分享到微信

文章评论

smirnoff
Re: .NET 数学库函数 Math.Pow() 对负数开奇数次方结果为 NaN,算 Bug 么?
dwen999 _BBCODE_WROTE:
很奇怪,这应该是个很 Basic 的问题。

如果不算,为什么?
算的话,应该存在很多年了,为什么MS 不改?

是因为网上有很多变通方案吗? MS 不好意思侵权?



msdn.microsoft.com/en-...s5e2h.aspx


转贴:

One of the big upgrades included in .NET 4.0 that seems to have been missed by most commentators is the introduction of support for complex numbers.


If you are a scientist then all I can say is - I'm sorry it has taken till version 4.0 to get complex support in .NET. It might not have been a real problem, as it has always been easy enough to add complex support by way of a custom struct, but its the thought that counts. Now we have a standard complex number facility that means you don't have to go DIY.
The new features are contained in System.Numerics but this isn't included automatically in a startup project - yes complex numbers are still a niche topic. To make use of it you have to right click on the References in the Solution Explorer and add System.Numerics. To make using the new features easier also add:
using System.Numerics;

......

www.i-programmer.info/...-in-c.html


msdn.microsoft.com/en-...s5e2h.aspx




bluebit.hubpages.com/h...s-in-Net-C


www.codeproject.com/Ar...ex-Numbers

2013-11-02 21:36:58 | 引用
Re: .NET 数学库函数 Math.Pow() 对负数开奇数次方结果为 NaN,算
谢谢 smirnoff 的 research 和时间。

可能是我的帖子没太明确导致误解。我说的是“对负数开奇数次方”。例如:

(-27) 开 3 次方,结果应该是 (-3),一个负实数。

但Math.Pow() 的结果为 NaN。所以我觉得可能是个 bug.

与复数无关。

我借用了最底部的答复中的方法得到我需要的答案:
social.msdn.microsoft....cubic-root

2013-11-02 22:20:02 | 引用
dwen999
陆压
Untitled
第二个参数是个浮点数,浮点数有精度问题,很难判断其倒数是奇数还是偶数

这是我的猜测而已

2013-11-02 22:26:27 | 引用
Untitled
陆压 _BBCODE_WROTE:
第二个参数是个浮点数,浮点数有精度问题,很难判断其倒数是奇数还是偶数
这是我的猜测而已


谢谢 。

I checked msdn.microsoft.com/en-....110).aspx and found as below:

For parameters:
x < 0 but not NegativeInfinity; y is not an integer, NegativeInfinity, or PositiveInfinity.

Return value: NaN

我给的语句是:

tmp = Math.Pow(-27.0, 1.0 / 3.0); // returns NaN.

结果与 msdn 文档描述一致。但我的理解是答案应该是 -3.000 浮点才对。

2013-11-02 22:52:18 | 引用
dwen999
smirnoff
Untitled
dwen999 _BBCODE_WROTE:
我给的语句是:

tmp = Math.Pow(-27.0, 1.0 / 3.0); // returns NaN.

结果与 msdn 文档描述一致。但我的理解是答案应该是 -3.000 浮点才对。




试一下


Complex.Pow ()

2013-11-02 23:41:30 | 引用
Re: .NET 数学库函数 Math.Pow() 对负数开奇数次方结果为 NaN,算
dwen999 _BBCODE_WROTE:
谢谢 smirnoff 的 research 和时间。

可能是我的帖子没太明确导致误解。我说的是“对负数开奇数次方”。例如:

(-27) 开 3 次方,结果应该是 (-3),一个负实数。





-27 开3次方,

俺算出来是:


1.5 + 2.59807621135331j


看来俺有点转不过玩。


1.5 + 2.59807621135331j 的模大约是 3.



2013-11-03 00:07:34 | 引用
smirnoff
aaaa6
引用回复: .NET 数学库函数 Math.Pow() 对负数开奇数次方结果为 NaN,算 Bug 么?
dwen999 _BBCODE_WROTE:
很奇怪,这应该是个很 Basic 的问题。

如果不算,为什么?
算的话,应该存在很多年了,为什么MS 不改?

是因为网上有很多变通方案吗? MS 不好意思侵权?



大文,这是实数的pow函数呢,这很正常。

对复数都可以开方,只要用cos, sin, arctan函数就行了,不过这类需求少所以c++ stl的代码没有移植过来。

2013-11-03 04:17:40 | 引用
Re: .NET 数学库函数 Math.Pow() 对负数开奇数次方结果为 NaN,算
谢谢楼上各位。

我以为实数范围内求解还是有一定普遍意义的。既然微软有专门复数相关的库,我也有理由认为这个 Math.Pow() 应该属于实数相关的。那么对于 -27 开三次方这样的问题,应该得出期望中的实数解 -3. 很多时候这个有需求。但给出个 NaN , 我总觉得别扭。

我想一般人也不指望能简单用 Math.Pow() 求出 -3 和另外两个复数解。

另外,同一函数对 4 开方,只能得出一个解 +2, 而没有 -2. 这个应该说也是不严格的。

可能大家都没有那么高的期望,碰到类似问题都自己开发了。

抑或 MS 认为多次开方属于专业数学工具如楼上 smirnoff 等所示的范畴,把这部分生存机会留给那些专业工具icon_smile.gif.

就如同 MS 一直不将 Paint, Windows Explorer, NotePad 作到更好?

2013-11-03 15:33:40 | 引用
dwen999

发表评论

加西网为北美中文网传媒集团旗下网站