tem*_*def 3 c++ floating-point trigonometry language-lawyer
是否有任何形式的保证 - 无论是在 C++ 标准中还是在其他一些文档中 -cos(x)当使用 g++、clang、MSVC 等编译时,C++ 代码计算将产生相同的值,假设这些实现使用 IEEE-754 64double位和输入值x完全相等?我的假设是“是”,但我想在依赖这种行为之前确认这一点。
背景:我正在教授一门课程,学生可能需要计算输入的三角函数。我可以保证这些输入在输入到函数中时是相同的。我知道平等测试double不是一个好主意,但在这种特定情况下,我想知道这样做是否安全。
cos是超越函数。超越函数容易陷入制表者困境。通俗地说,这意味着:假设您想出了一些迭代算法来近似输入值的余弦:例如泰勒级数。当您运行此迭代算法时,您必须决定在中间阶段保留多少额外精度(过早舍入可能会降低最终结果的准确性)。但由于该函数是超越的,因此很难确定在计算过程中必须携带多少额外位才能产生正确舍入的最终结果,并且对于某些输入值,所需的额外位数量可能非常大。
因此,设计硬件来保证cos等超越函数的正确舍入结果通常是不切实际的(其中“正确舍入”意味着生成的浮点值是最接近函数真实值的值) 。相反,硬件设计人员将实施一种计算技术,该技术执行得相当好,并且对于大多数实际输入值,将产生与准确的实际结果相差 1 位以内的结果。(如果你绝对需要一个总能产生正确舍入结果的余弦函数,那么显然可以实现一个:GNU MPFR 声称已经做到了。但这会比硬件性能差得多。)
IEEE 754 (2008) 将cos列为“推荐的正确舍入函数”之一,这意味着如果您实现 IEEE 754 版本的cos,则必须产生正确舍入的结果。但这些功能只是“推荐”提供,而不是必需的。因此,IEEE 754 的一致实现可能无法提供正确舍入的cos函数,而可能提供上一段所述的“实用” cos函数。因此,在实践中,都声称符合 IEEE 754 标准的 C++ 的两个实现可能不会为超越函数产生完全相同的值,例如cos当应用于相同的参数时。
(请注意,IEEE 754要求实现提供正确舍入的平方根函数。这不是超越函数,因此正确舍入它并不那么困难。)
| 归档时间: |
|
| 查看次数: |
205 次 |
| 最近记录: |