为什么False在.NET 4中打印此代码?似乎是显式强制转换导致某些意外行为。除了“浮点数不准确”或“不要那样做”之外,我想要一个答案。float a(float x, float y){ return ( x * y );}float b(float x, float y){ return (float)( x * y );}void Main(){ Console.WriteLine( a( 10f, 1f/10f ) == b( 10f, 1f/10f ) );}PS:此代码来自单元测试,而不是发布代码。该代码是故意以这种方式编写的。我怀疑它最终会失败,但是我想确切地知道何时以及为什么。答案证明了此技术的有效性,因为它提供了一种超出对浮点确定性的通常理解的理解。这就是以这种方式编写此代码的目的;刻意探索。PPS:单元测试在.NET 3.5中通过,但是现在升级到.NET 4后失败。
3 回答
慕田峪9158850
TA贡献1794条经验 获得超7个赞
我现在没有Microsoft编译器,Mono没有这种效果。据我所知,GCC 4.3+使用gmp和mpfr在编译时计算一些东西。C#编译器可以对同一程序集中的非虚拟,静态或私有方法执行相同的操作。显式强制转换可能会干扰这种优化(但是我看不出为什么它不能具有相同的行为)。也就是说,它可以内联到某种程度上计算常数表达式(b()例如,可能取决于类型转换)。
如果有必要,GCC还具有将操作提升到更高精确度的优化。
因此,我认为这两种优化都是潜在的原因。但是对于他们两个,我都没有理由对结果进行显式强制转换可能会具有一些其他含义,例如“更接近于标准”。
收到一只叮咚
TA贡献1821条经验 获得超4个赞
不管您想调用它是什么,都可以。就是很多人错误地或不完全地将此问题归因于此。问题的重点是去了解“其他东西”。为此,需要对问题和答案进行编辑。我希望没有人提到浮点“精度”的基础知识,因为这个问题(正如Eric详尽解释的那样)比通常所知的浮点“精度”更为复杂。这就是为什么仅对浮点“准确性”的评论仍被人们赞成的原因。
- 3 回答
- 0 关注
- 562 浏览
添加回答
举报
0/150
提交
取消