如何确保函数在 C/C++ 中返回一致的浮点值?
我的意思是:如果a
和b
是浮点类型,如果我写了一个多项式函数(它接受浮点参数并返回浮点结果),让我们调用它polyfun()
,编译器是否可以确保:
如果a==b
, 那么polyfun(a)==polyfun(b)
, 这意味着数学运算/四舍五入的顺序在运行时是一致的吗?
如何确保函数在 C/C++ 中返回一致的浮点值?
我的意思是:如果a
和b
是浮点类型,如果我写了一个多项式函数(它接受浮点参数并返回浮点结果),让我们调用它polyfun()
,编译器是否可以确保:
如果a==b
, 那么polyfun(a)==polyfun(b)
, 这意味着数学运算/四舍五入的顺序在运行时是一致的吗?
语言标准不保证可重现的结果。通常,允许 C 实现以比标称类型更高的精度评估浮点表达式。它可能会以不可预知的方式这样做,例如在一个地方而不是另一个地方内联函数调用,或者在两个地方内联函数调用,但在一个地方,将结果缩小到名义类型以将其保存在堆栈中,然后再检索将其与另一个值进行比较。
这个问题中有一些附加信息,并且可能还有其他重复信息。
处理此问题的方法因语言和实现(尤其是编译器)而异,因此如果您指定使用的 C 或 C++ 实现,包括目标系统的详细信息,以及搜索相关问题,您可能会获得更多信息.
而不是 polyfun(a)==polyfun(b) 尝试 ABS(polyfun(a) - polyfun(b)) < 1e-6, 或 1e-12 或任何你认为适合“接近”的东西......(是的,累积浮点错误仍然会杀死你。)