为什么这个C#浮点比较仅在32位失败?

Mar*_*fli 3 c# floating-point

在比较时,我得到了非常不同的结果,看起来像是相同的浮点比较语句.奇怪的是,这两个陈述在64位中都是正确的,而在32位中,结果不相等.

即使我明确地将'132'和/或'initial'转换为Int32,32位的结果仍然是相同的.

int initial = 134;
float initialConverted = initial/255.0f;

// both are true in 64, abs2 is false in 32
var abs = Math.Abs(initialConverted - (134/255.0f)) < float.Epsilon;
var abs2 = Math.Abs(initialConverted - (initial/255.0f)) < float.Epsilon;
Run Code Online (Sandbox Code Playgroud)

当整数值存储在自己的字段中时,为什么划分存在问题?

ang*_*son 5

这只是正常浮点比较和精度问题的变体.

浮点计算是稍微在32位和64位不同,并且略微之间DEBUG和发布版本不同.最有可能在一个设置中,它评估为0,在另一个设置中评估为等于或略大于float.Epsilon.

我不会用float.Epsilon,这是远远太小,无法处理正常的误差.相反,你需要自己决定一个epsilon值,这将是"足够接近".

float.Epsilon是相同的Single.Epsilon,记录为:

表示大于零的最小正单值.该字段是常量.

换句话说,这只是Single数据类型中可表示的最小数字,它不能用于处理计算中的不准确性,您需要更大的数字.Single.Epsilon在1.4E-45附近的某个地方,根本不允许有任何不准确之处.