gpt4 book ai didi

c++ - 混合函数 - 增加 float

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:00:32 27 4
gpt4 key购买 nike

我正在浏览代码库并找到以下模板函数:

template <class T, class T2>
T mix(const T &a, const T &b, const T2 &interp) {
static constexpr T2 one = ((T2)1);
return (a * (one - interp)) + (b * interp);
}

和下面的评论

// You'd think instead of doing the a*(1-t) + b*t, it'd be faster
// and one less multiply to do a + (b-a)*t, right? Bad! Increases floating
// point exception occurances. Same as LERP

有人可以强调为什么这是真的吗?

最佳答案

正如 Paul R 在评论中所说,这些评论可能指的是非正规(我通常将它们描述为次正规,所以会使用该术语)数字,它填补了浮点运算中零附近的下溢间隙。

如果 ab 的值足够接近,则 a-b 将产生一个次正规值。当这些值完全在硬件中处理时,通常会影响性能。有一些技术可以在硬件中缓解这种情况,但是对于一些现代处理器,涉及次正规值的指令所花费的时间可能比作用于正常值的相同指令长 100 倍以上。如果这些值完全在软件中处理(例如,硬件指令不直接处理它们,并且会引发必须捕获然后在软件中解决的浮点异常),那么性能几乎总是会下降。

根据应用程序的类型,由此产生的问题可能会有所不同,从无关紧要的(例如,对于不经常遇到次正规的长数值计算来说额外的几毫秒)到主要的(例如,将潜在的时序侧信道引入到一个与安全相关的系统)。

问题中给出的解决方案确实依赖于 interp 本身既不是次正规,也不太接近 1.0

关于c++ - 混合函数 - 增加 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37805450/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com