gpt4 book ai didi

c# - CodeContracts 报告两个 double 之间的精度不匹配

转载 作者:行者123 更新时间:2023-11-30 12:46:31 26 4
gpt4 key购买 nike

给定以下 C# 代码,

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

CodeContracts 给出警告:Possible precision mismatch for the arguments of ==

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

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);

它没有给我任何警告。第一个案例与其他值得警告的案例有何不同?

更新

只是生成此警告的另一个示例,这次是作为部门运算符(operator)的 guard :

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 报告两个 double 之间的精度不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19771696/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com