Floating point 浮点sqrt()函数是否保证顺序关系
给定两个浮点数x和y,假设所有浮点数运算都符合IEEE754标准,并且平方根函数sqrt()的特定实现Floating point 浮点sqrt()函数是否保证顺序关系,floating-point,precision,floating-accuracy,Floating Point,Precision,Floating Accuracy,给定两个浮点数x和y,假设所有浮点数运算都符合IEEE754标准,并且平方根函数sqrt()的特定实现 如果x
x
y
但是sqrt(x)
sqrt(y)
。由于平方根是单调的,那么sqrt(x)
必须比sqrt(y)
更接近y的数学平方根,或者sqrt(y)
必须比sqrt(x)
更接近x的数学平方根。因此,这将违反舍入规则
其他舍入规则在特定方向上舍入到最近的数字,即朝向+无穷大、朝向−无穷大,或接近零。无序的sqrt
结果也会违反这些舍入规则
请注意,许多平台将声称使用IEEE 754格式,但这并不意味着它们符合IEEE 754操作规则,包括平方根和从十进制到浮点的转换
问题2是相同的
问题3具有相同的推理(应用两次:op
是弱单调的,sqrt
是弱单调的),但前提条件是a和b是非负的(或者由于转换过程中的舍入,其大小非常小,以至于x
[或y
]为零,即使a[或b]为负)。否则,您可能有asqrt(x)(1)将很难实现sqrt
是一种将整个浮点范围压缩到该范围一半左右的操作,因此在某些情况下,最终必然会出现x!=y
但是sqrt(x)=sqrt(y)
@MarkDickinson它不仅与范围有关,而且与分辨率有关。当一个浮点数减少x到sqrt(x)时,分辨率会更高。我想你没有抓住我的重点。设我们是所有非负有限浮点数的(有限!)集。然后sqrt从S映射到S的严格子集。根据鸽子洞原理,这保证了碰撞。所以你的财产(1)是不可能实现的。出于同样的原因,(5)是不可能的。所以最后两个问题是多余的:不可能有满足(1)、(2)、(3)和(4)的sqrt实现(因为这样的实现已经不能满足(1))。同样,没有满足(5)、(6)、(7)和(8)要求的实现。@MarkDickinson fair point。@MarkDickinson非常感谢您帮助澄清问题。我更新了这个问题以更好地反映我的意图,即sqrt()操作可能的保序性。非常清楚的说明,非常感谢。对于符合IEEE 754标准的操作,它们是在CUP级别支持的,还是在编译器级别支持的,还是作为单独的库实现的?@JohnZ.Li:这就像询问汽车的运动是由汽车、传动系还是发动机提供的。一切都必须共同努力才能产生结果。现代的通用处理器内置了浮点运算的基本算法,如果硬件不提供,则需要编译器和软件库来正确使用它,并添加对附加功能的支持,例如从十进制到二进制浮点的转换和sqrt
。某些编译器不符合IEEE 754,即使硬件符合。