在比较时,我得到了非常不同的结果,看起来像是相同的浮点比较语句.奇怪的是,这两个陈述在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)
当整数值存储在自己的字段中时,为什么划分存在问题?
这只是正常浮点比较和精度问题的变体.
浮点计算是稍微在32位和64位不同,并且略微之间DEBUG和发布版本不同.最有可能在一个设置中,它评估为0,在另一个设置中评估为等于或略大于float.Epsilon.
我不会用float.Epsilon,这是远远太小,无法处理正常的误差.相反,你需要自己决定一个epsilon值,这将是"足够接近".
float.Epsilon是相同的Single.Epsilon,记录为:
表示大于零的最小正单值.该字段是常量.
换句话说,这只是Single数据类型中可表示的最小数字,它不能用于处理计算中的不准确性,您需要更大的数字.Single.Epsilon在1.4E-45附近的某个地方,根本不允许有任何不准确之处.
| 归档时间: |
|
| 查看次数: |
196 次 |
| 最近记录: |