为什么在glsl中变化的浮点相等测试失败?

时间:2013-07-06 20:04:31

标签: ios opengl-es glsl

如果我的着色器程序中有不同的浮点数:

varying highp float someFloat;

在顶点着色器中,我将其设置为某种东西。

someFloat = 1.0;

为什么在我的片段着色器中这个比较似乎返回false?

someFloat == 1.0 // false

但这会返回true?

someFloat > .0 // true

在iPad mini上测试openGL ES。

1 个答案:

答案 0 :(得分:12)

它发生在任何IEEE 754浮点数上。这是因为浮点表示的本质。任何使用IEEE 754格式的语言都会遇到同样的问题。

由于1.0可能无法在浮点系统中完全表示为1.000000000...,因此使用==比较它们被认为是危险的。 应始终将浮点数与epsilon值进行比较。

由于浮点计算涉及一些不确定性,我们可以尝试通过查看两个数字是否彼此“接近”来实现这一点。如果您根据错误分析,测试或疯狂猜测决定 - 结果应始终在预期结果的0.00001范围内,那么您可以将比较更改为:

if (fabs(someFloat - 1.0)) < 0.00001)

最大错误值通常称为epsilon。

您可能应阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic