gpt4 book ai didi

c++ - cos(x) 是否需要在使用 IEEE-754 的不同 C++ 实现中返回相同的值?

转载 作者:行者123 更新时间:2023-12-04 16:36:28 25 4
gpt4 key购买 nike

是否有任何形式的保证——无论是在 C++ 标准中还是在其他文档中——C++ 代码计算 cos(x) 在使用 g++、clang、MSVC 等编译时将产生相同的值.,假设这些实现使用 IEEE-754 64 位 double 并且输入值 x 完全相等?我的假设是"is",但我想在依赖此行为之前确认这一点。

上下文:我正在教授一门类(class),学生可能需要在该类(class)中计算输入的三角函数。我可以保证这些输入在输入函数时是相同的。我知道对 double 进行相等性测试不是一个好主意,但在这种特定情况下,我想知道这样做是否安全。

最佳答案

cos 是超越函数。超越函数受制于制表者困境。通俗地说,这意味着:假设您提出了一些迭代算法来近似输入值的余弦值:例如,泰勒级数。当您运行此迭代算法时,您必须决定在中间阶段保留多少额外精度(过早舍入可能会降低最终结果的准确性)。但是因为该函数是超越的,所以很难确定在计算过程中必须携带多少额外的位才能产生正确舍入的最终结果,并且对于某些输入值,额外的位数需要的可能非常大。

出于这个原因,设计硬件来保证超越函数(例如 cos)的正确舍入结果通常是不切实际的(其中“正确舍入”意味着得到的浮点值是最接近函数的真实值)。取而代之的是,硬件设计人员将实现一种性能相当不错的计算技术,对于大多数实际输入值,将产生与实际结果相差 1 位以内的结果。 (如果你绝对需要一个总是产生正确舍入结果的余弦函数,那么显然 可能 实现一个:GNU MPFR 声称已经做到了。但这将比硬件性能差得多。)

IEEE 754 (2008) 将 cos 列为“推荐的正确舍入函数”之一,这意味着如果您实现 IEEE 754 版本的 cos,那么您有以产生正确舍入的结果。但这些功能只是“建议”提供,并非必需。因此,符合 IEEE 754 标准的实现可能不会提供正确舍入的 cos 函数,而是可能会提供上一段中描述的“实用”cos 函数。因此,在实践中,当应用于同一参数时,都声称符合 IEEE 754 标准的 C++ 的两个实现可能不会为超越函数(例如 cos)产生完全相同的值。

(请注意,IEEE 754 要求实现提供正确四舍五入的平方根函数。这不是超越函数,因此正确四舍五入并不难。)

关于c++ - cos(x) 是否需要在使用 IEEE-754 的不同 C++ 实现中返回相同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69380549/

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