为什么我会得到NaN?

时间:2010-07-30 15:49:02

标签: c#

我正在查看我的代码,每次D1最终都是NaN。代码对我来说很好,我完全被难过......

double D1;
Data Data = new Data();

PriceSpot = 40;
Data.PriceStrike = 40;
Data.RateInterest = .03;
Data.Volatility = .3;
Data.ExpriationDays = 300;

D1 = 
    (
        Math.Log(PriceSpot/Data.PriceStrike) +
        (
            (Data.RateInterest + (Math.Pow(Data.Volatility,2)/2)) *
            (Data.ExpirationDays/365)
        )
    ) /
    (
        Data.Volatility *
        Math.Pow(Data.ExpirationDays/365,.5)
    );

4 个答案:

答案 0 :(得分:11)

Data.Volatility * Math.Pow(Data.ExpirationDays/365,.5)自300/365起为0,因为int等于0

假设ExpriationDays属性确实属于int类型,它将使整个表达式为0。

例如:

[Test]
public void Test()
{
    var val = 300 / 365;

    Assert.That(val, Is.EqualTo(0));
}

关于除以0的一些评论:

当分割两个0整数时,将在运行时抛出异常:

[Test]
public void TestIntDiv()
{
    int zero = 0;
    int val;

    Assert.Throws<DivideByZeroException>(() => val = 0 / zero);
}

当将两个0加倍时,结果将是NaN,并且不会抛出任何异常:

[Test]
public void TestDoubleDiv()
{
    double zero = 0;
    double val = 0 / zero;

    Assert.That(val, Is.NaN);
}

答案 1 :(得分:3)

检查Data.ExpirationDays的类型,如果类型为整数,Data.ExpirationDays/365可能正在评估为0。这意味着分母将为零(零的平方根为零,零乘以Data.Volatility 仍然零),这将导致问题。

事实上,在你的情况下,分子结果也是零,因为log n 1总是为零,你将它加到零(另一个值乘以{{1} })。

您可能需要考虑在整个过程中使用浮点类型。

答案 2 :(得分:1)

  • Data.ExpirationDays/365等于零。
  • 0 ^ 0.5也等于零。
  • Data.Volatility * 0 = 0。
  • D1 = Something / 0。

所以NaN非常期待。

答案 3 :(得分:0)

是不是因为您将Data.ExpirationDays错误拼写为Data.ExpriationDays所以Data.ExpirationDays默认为0?这将给出0/0,即NaN(分子是0 b / c,你碰巧有罢工=现货)

(我从来没有使用过C#,所以我不确定这只是你的帖子或你的代码中的错误(我希望编译器可以捕获它)。