麻烦将-1提高到合理的基于分数的功率

时间:2012-09-27 00:16:58

标签: c# math rational-number fractions exponent

在我的TI-84 Plus(银版)上,我可以输入以下内容而不会出现错误:( - 1)^(1/3)= -1 我也知道输入一些像下面这样的表达式会产生一个非实数的数字,如:( - 1)^。5

现在,我的问题在于C#的Math对象。如果我发送任何分数,例如:{1.667, 109.667, 0.667, 120.667} OR {4/3, 111/3, 2/3, 122/3},我会得到:{NaN, NaN, NaN, NaN}

我是否必须编写一个新对象MathHelper来检查理性值并根据有限的输入开关返回答案?或者我缺少Math对象的功能。我可以在计算器上做到这一点......

PS,我在网上没有遇到任何类似的问题;如果这是重复的,请通知我;)

[我的新观点]
感谢大家的帮助!我已经完成了将“Microsoft.Solver.Foundation.dll”升级到4.0目标框架,结果发现'Rational'对象似乎只返回-1和'Indeterminate'。然后在Google上输入(-1)^(1/2)[nonreal ans]之后,我突然意识到我正在使用n-root!所以,事实证明我过去已经用C#管理了虚数,因此解决了我的问题:

Any even root 2n of a negative number -m will always equal an imaginary number i. (2n√-m)=i 我无法相信我忘记了这个简单的代数属性

2 个答案:

答案 0 :(得分:0)

你必须编写自己的Math助手才能完成这样的功能(至少对Math.Pow而言)。编辑:或者您可以使用评论中提到的Rational库。

根据文件:

  

输入:x< 0但不是NegativeInfinity; y不是整数,NegativeInfinity或PositiveInfinity。

     

结果:NaN

在此处查看文档:{​​{3}}

答案 1 :(得分:0)

在C#中,( - 1)^ R未定义为R的非整数值。 如果你试图计算(-1)^(1/3),C#将首先计算1/3,导致R的非整数浮点数。

解决方案: 使用数学标识:

  a^(x/y) = a^x * a^(1/y)  x,y integers

对于否定a,请使用:

 a^1/y = -(|a|^1/y)  // only works if y is odd

或者放在一起:

if (a < 0) {
  if (y % 2 = 1) {
    result = a^x * -1 * (-a)^(1.0/y);   // Replace ^ with the correct C# call.
  } else {
     // NaN
  }
} else {
  result = a^(x/y);
}