【问题标题】:Why does varying float equality test fail in glsl?为什么在 glsl 中不同的浮点相等测试失败?
【发布时间】:2013-07-06 20:04:30
【问题描述】:

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

varying highp float someFloat;

在顶点着色器中,我将其设置为某个值。

someFloat = 1.0;

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

someFloat == 1.0 // false

但这会返回 true 吗?

someFloat > .0 // true

在 iPad mini 上测试 openGL ES。

【问题讨论】:

    标签: ios opengl-es glsl


    【解决方案1】:

    它发生在任何 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

    【讨论】:

    • 谢谢!我现在很高兴我问了。
    猜你喜欢
    • 2011-05-01
    • 1970-01-01
    • 2010-09-26
    • 2011-04-16
    • 1970-01-01
    • 2011-04-19
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多