gpt4 book ai didi

java - 关于 Math.atan2 的保证

转载 作者:太空狗 更新时间:2023-10-29 22:41:03 27 4
gpt4 key购买 nike

Math.atan2 的文档说

The computed result must be within 2 ulps of the exact result.

它说 2 ulps 的事实大概意味着在某些情况下返回值不是最接近真实结果的 double。有谁知道是否保证为等效的 int 参数对返回相同的值?换句话说,如果 abk 是正 int 值并且 a * k 都不是b * k 溢出,是否保证

Math.atan2(a, b) == Math.atan2(a * k, b * k) 

编辑

请注意,这绝对不是非溢出 long 乘法的情况。例如

long a = 959786689;
long b = 363236985;
long k = 9675271;
System.out.println(Math.atan2(a, b));
System.out.println(Math.atan2(a * k, b * k));

打印

1.2089992287797169
1.208999228779717

但我无法在 int 值中找到示例。

最佳答案

Does anyone know if it is guaranteed to return the same value for equivalent pairs of int parameters?

简单地说,没有。 Math 文档事实的来源,它不提供超出您引用的 2 ulp 限制的保证。这是设计使然(正如我们将在下面看到的),因此任何其他来源要么暴露了实现细节,要么就是错误的。

试探性地寻找下界是不切实际的,因为 Math 的行为被记录为特定于平台的:

Unlike some of the numeric methods of class StrictMath, all implementations of the equivalent functions of class Math are not defined to return the bit-for-bit same results. This relaxation permits better-performing implementations where strict reproducibility is not required.

因此,即使您在测试中看到更严格的界限,也没有理由相信这些界限可以跨平台、处理器或 Java 版本移植。

但是,正如Math 的文档说明,StrictMath有更明确的行为。 StrictMath 被记录为跨平台一致地执行,并且预期具有与引用实现相同的行为 fdlibm .该项目的readme备注:

FDLIBM is intended to provide a reasonably portable ... reference quality (below one ulp for major functions like sin,cos,exp,log) math library.

您可以引用 source code for atan2并通过检查其实现来确定精确的界限; StrictMath.atan2() 的任何其他实现都需要提供与引用实现相同的结果。

有趣的是,StrictMath.atan2() 不包含与 Math.atan2() 相同的 2 ulp 注释。虽然如果它明确地重复 fdlibm 的“低于一个 ulp”评论会很好,但我认为没有这个评论意味着 StrictMath 的实现不需要包括该警告 - 它总是低于 1 个 ulp。

tl;dr 如果您需要跨平台的精确结果或稳定结果,请使用 StrictMath数学 以精度换取速度。

关于java - 关于 Math.atan2 的保证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37355486/

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