C#-释放模式甚至对于浮点变量也使用双精度
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#-释放模式甚至对于浮点变量也使用双精度,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2258字,纯文字阅读大概需要4分钟。
内容图文
我的算法正在为单精度浮点算法计算epsilon.大概在1.1921e-007附近.这是代码:
static void Main(string[] args) {
// start with some small magic number
float a = 0.000000000000000013877787807814457f;
for (; ; ) {
// add the small a to 1
float temp = 1f + a;
// break, if a + 1 really is > '1'
if (temp - 1f != 0f) break;
// otherwise a is too small -> increase it
a *= 2f;
Console.Out.WriteLine("current increment: " + a);
}
Console.Out.WriteLine("Found epsilon: " + a);
Console.ReadKey();
}
在调试模式下,它提供以下合理的输出(缩写):
current increment: 2,775558E-17
current increment: 5,551115E-17
...
current increment: 2,980232E-08
current increment: 5,960464E-08
current increment: 1,192093E-07
Found epsilon: 1,192093E-07
但是,当切换到发布模式时(无论是否进行优化!),该代码都会产生以下结果:
current increment: 2,775558E-17
current increment: 5,551115E-17
current increment: 1,110223E-16
current increment: 2,220446E-16
Found epsilon: 2,220446E-16
对应于双精度值.因此,我假设一些优化导致对双精度值的计算.在这种情况下,结果当然是错误的!
另外:仅在项目选项中以X86 Release为目标时,才会发生这种情况.同样:优化开/关无关紧要.我使用的是64位WIN7,VS 2010 Ultimate,目标是.NET 4.0.
什么可能导致该行为?一些WOW问题?如何以一种可靠的方式解决它?如何防止CLR生成使用双精度而不是单精度计算的代码?
注意:切换到“任何CPU”甚至“ X64”作为平台目标是没有选择的-即使此处没有发生问题.但是我们有一些本机库,版本不同,适用于32/64位.因此目标必须明确.
解决方法:
如评论中所述,这是预料之中的.可以通过取消JIT将值保留在寄存器中(将比实际值宽)的能力来回避-通过强制将其减小到字段(具有明确定义的大小):
class WorkingContext
{
public float Value; // you'll excuse me a public field here, I trust
public override string ToString()
{
return Value.ToString();
}
}
static void Main()
{
// start with some small magic number
WorkingContext a = new WorkingContext(), temp = new WorkingContext();
a.Value = 0.000000000000000013877787807814457f;
for (; ; )
{
// add the small a to 1
temp.Value = 1f + a.Value;
// break, if a + 1 really is > '1'
if (temp.Value - 1f != 0f) break;
// otherwise a is too small -> increase it
a.Value *= 2f;
Console.Out.WriteLine("current increment: " + a);
}
Console.Out.WriteLine("Found epsilon: " + a);
Console.ReadKey();
}
有趣的是,我首先使用结构体进行了尝试,但JIT能够克服我的作弊行为(大概是因为它们全都在堆栈中).
内容总结
以上是互联网集市为您收集整理的C#-释放模式甚至对于浮点变量也使用双精度全部内容,希望文章能够帮你解决C#-释放模式甚至对于浮点变量也使用双精度所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。