7

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

varying highp float someFloat;

在顶点着色器中,我将它设置为一些东西。

someFloat = 1.0;

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

someFloat == 1.0 // false

但这返回true?

someFloat > .0 // true

在 iPad mini 上测试 openGL ES。

4

1 回答 1

13

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

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

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

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

最大误差值通常称为 epsilon。

也许您应该阅读每个计算机科学家应该了解的关于浮点运算的知识

于 2013-07-06T20:05:57.693 回答