c# – CodeContracts报告两个双精度之间的精度不匹配

c# – CodeContracts报告两个双精度之间的精度不匹配,第1张

概述鉴于以下C#代码, double x = 2.0;x *= 0.5;bool y = (x == 1.0);Console.WriteLine(y); CodeContracts给出警告:==的参数可能存在精度不匹配. 如果我将代码更改为以下任何一项: double x = 2.0 * 0.5;bool y = (x == 1.0);Console.WriteLine(y); 要么 do 鉴于以下C#代码,

double x = 2.0;x *= 0.5;bool y = (x == 1.0);Console.Writeline(y);

CodeContracts给出警告:==的参数可能存在精度不匹配.

如果我将代码更改为以下任何一项:

double x = 2.0 * 0.5;bool y = (x == 1.0);Console.Writeline(y);

要么

double x = 2.0 * 0.5;bool y;if (x == 1.0) {  y = true;} else {  y = false;}Console.Writeline(y);

或者,也许最令人困惑的

double x = 2.0;x *= 0.5;bool y = ((double)x == 1.0);Console.Writeline(y);

它没有给我任何警告.是什么让第一种情况与其他情况不同,值得警告?

更新

这个警告的另一个例子就是产生,这次作为一个分工运算符的守卫:

Contract.Requires<ArgumentOutOfRangeException>(rhs != 0.0);
解决方法 该声明

double x = 2.0 * 0.5;

可能从未在运行时执行过;它只会被编译器简化为

double x = 1.0;

此外,检查相等性仍不能保证该值是否“正好一个”.考虑一下:

double x = 100000000000.0;x*= 0.00000000001;Console.Writeline(x); // Prints "1"bool y = ((double)x == 1.0);Console.Writeline(y); // Prints "False"
总结

以上是内存溢出为你收集整理的c# – CodeContracts报告两个双精度之间的精度不匹配全部内容,希望文章能够帮你解决c# – CodeContracts报告两个双精度之间的精度不匹配所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1230276.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存