- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
java.lang.Math
文档说明了很多函数,例如 Math.pow
:
The computed result must be within 1 ulp of the exact result.
但我一直没能找到这到底是什么意思。是排他性的还是包容性的?换句话说,如果确切的结果可以用 double 表示,返回值是否包含准确的结果,或者它仍然可能偏离 1 ULP?
例如,我们可以依赖 Math.pow(3.0, 2.0) == 9.0
吗?我知道使用相等比较对于 double 几乎总是一个坏主意,所以我主要是出于好奇并且能够在人们做类似事情时指出他们的错误(或让他们放心)。
最佳答案
仅供引用,
The quality of implementation specifications concern two properties, accuracy of the returned result and monotonicity of the method. Accuracy of the floating-point Math methods is measured in terms of ulps, units in the last place. For a given floating-point format, an ulp of a specific real number value is the distance between the two floating-point values bracketing that numerical value. When discussing the accuracy of a method as a whole rather than at a specific argument, the number of ulps cited is for the worst-case error at any argument. If a method always has an error less than 0.5 ulps, the method always returns the floating-point number nearest the exact result; such a method is correctly rounded. A correctly rounded method is generally the best a floating-point approximation can be; however, it is impractical for many floating-point methods to be correctly rounded.
Instead, for the Math class, a larger error bound of 1 or 2 ulps is allowed for certain methods. Informally, with a 1 ulp error bound, when the exact result is a representable number, the exact result should be returned as the computed result; otherwise, either of the two floating-point values which bracket the exact result may be returned.
For exact results large in magnitude, one of the endpoints of the bracket may be infinite. Besides accuracy at individual arguments, maintaining proper relations between the method at different arguments is also important. Therefore, most methods with more than 0.5 ulp errors are required to be semi-monotonic: whenever the mathematical function is non-decreasing, so is the floating-point approximation, likewise, whenever the mathematical function is non-increasing, so is the floating-point approximation. Not all approximations that have 1 ulp accuracy will automatically meet the monotonicity requirements.
关于java.lang.Math—— “within 1 ULP” 是独占还是包含?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35658665/
我需要 ulp对于给定的 double 值,但由于我正在为代号 ONE 开发,因此未提供 ulp(double)。有谁知道用 Java 计算 ulp 的有效算法?代号 ONE 仅提供 Math 类(j
我有两个字符串形式的十进制数字,它们的舍入略有不同。我想要一个函数,如果它们仅相差 1 ulp(即仅最后一位数字相差 1),则将它们视为“相等”。 目前我能想到的最易读的形式是这样的: private
我阅读了网络上的一些资源,我了解到在比较 float 时没有单一值或通用参数。我读过 from here几个回复,我从谷歌测试中找到了比较 float 的代码。我想更好地理解 ULP 的含义及其值(v
我有一个关于浮点精度的问题。据我了解,ULP 是给定规范中两个连续的离散有限数之间的距离。或如名称所述位于最不重要位置的单位。无论如何,我在 java.lang.Math 中的 sinh 的 Java
谁能解释一下最低精度的 ULP 单位?我有如下定义,但还是不清楚 “表示分数时的误差大小与存储的数字大小成正比。ULP 或最小精度单位定义了存储数字时可以获得的最大误差。存储的数字越大,ULP 越大”
.NET 是否有内置方法来计算 ULP给定的 double 型或浮点型? 如果没有,最有效的方法是什么? 最佳答案 看起来这个功能很简单;这是基于 vulkanino 链接问题的接受答案中的伪代码:
我试图避免使用 epsilon 比较来比较浮点类型。尽管 this article,但我能想到的最佳解决方案使用了 ULP 的差异(单位在最后一位)使用整数表示有一个更好的解决方案(/// 表示我自己
我无法在网上找到任何不假设我知道事情的信息。我想知道是否有人知道我可以研究哪些好的资源来帮助我了解这个函数的具体功能? 根据我收集的信息,我很确定这是错误的,或者至少不完全正确,是否给定一个浮点,它确
我已经成功地编写了一个基于 Ulps 的函数来比较两个 double 是否相等。根据this page ,可以使用绝对和相对 epsilon 的组合或使用整数 (Ulps) 进行比较。 我制作了基于
.NET 是否有内置方法来计算 ULP给定的 double 或 float ? 如果不是,最有效的方法是什么? 最佳答案 看起来这个功能很简单;这是基于 vulkanino 链接的问题的已接受答案中的
如何判断两个 float 之差是否最多为1 ULP? 类似于下面的代码,它(忽略符号和指数,并且)提取尾数的二进制,但稍微不那么糟糕: a = int(.hex().lstrip('-').lstri
java.lang.Math 文档说明了很多函数,例如 Math.pow : The computed result must be within 1 ulp of the exact result.
我正在尝试更详细地了解 Java 中的浮点运算。如果我正确阅读了文档,则以下内容适用于任何给定的双 x: x - Math.ulp(x) == Math.nextAfter(x, Double.NEG
我正在使用 CCS8,使用结构并初始化变量,如下面的代码所示。 CCS 在第 15、16 和 17 行给我的评论如下: #1546-D:(ULP 15.1)检测到连续的位域分配。建议改用位掩码 我真的
我是高性能计算 (HPC) 方面的新手,但我将有一个 HPC 项目,因此我需要一些帮助来解决一些基本问题。 应用场景很简单:通过InfiniBand(IB)网络连接几台服务器,一台服务器做Master
Math.nextUp(arg) 始终与 arg + Math.ulp(arg) 相同,还是我遗漏了什么? System.out.println( 0.5 + Math.ulp(0.5));
我有一组基于通过 json 数据包接收到的数字的浮点计算。在计算结束时,我要求其中一个数字 >= -0.5。我发现有时我有一个未通过测试的值,因为它是一个 ULP低于阈值。无论如何要写一个conste
我是一名优秀的程序员,十分优秀!