我正在使用以下代码:
float test = (float)Math.Pow(10,1.946);
问题在于此代码返回0
而不是88.30799004
。
同样,在使用以下代码时,它将返回0
:
double test = Math.Pow(10,1.946);
我正在使用Xamarin,并且已经在变量上设置了一个断点。使用完全相同的代码,它确实消失了,但是返回0
,为什么会这样?
答案 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);
}
}
}
请注意,通常这是一个相当不错且运作良好的部分。但是不幸的是,使用简约的测试示例,很容易导致此类问题。