Math.Pow(10,1.946)返回0

时间:2018-11-25 20:57:57

标签: c# xamarin

我正在使用以下代码:

float test = (float)Math.Pow(10,1.946);

问题在于此代码返回0而不是88.30799004。 同样,在使用以下代码时,它将返回0

double test = Math.Pow(10,1.946);

我正在使用Xamarin,并且已经在变量上设置了一个断点。使用完全相同的代码,它确实消失了,但是返回0,为什么会这样?

1 个答案:

答案 0 :(得分:1)

“没有使用Debug.Write()并越过断点:它保持为0。当我添加Debug.Write()并越过断点时,它确实返回了正确的值88.30799004。这有点奇怪吗?”

不像您想的那样奇怪。 “及时”编译器或JiT的一项工作是切出无效代码。虽然通常在调试构建过程中将例程转换为“很少优化”,但仍有一些例程存在。我曾经编写此代码来强制运行时运行到“ 2 GiB”限制。直到我真正添加了输出,一切都没有发生:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace OOM_32_forced
{
    class Program
    {
        static void Main(string[] args)
        {
            //each short is 2 byte big, Int32.MaxValue is 2^31.
            //So this will require a bit above 2^32 byte, or 2 GiB
            short[] Array = new short[Int32.MaxValue];

            /*need to actually access that array
            Otherwise JIT compiler and optimisations will just skip
            the array definition and creation */
            foreach (short value in Array)
                Console.WriteLine(value);
        }
    }
}

请注意,通常这是一个相当不错且运作良好的部分。但是不幸的是,使用简约的测试示例,很容易导致此类问题。