谁能解释最低精度的ULP单位?
我有以下定义,但仍不清楚
“表示分数时的错误大小与所存储数字的大小成正比。ULP或最小精度单位定义了在存储数字时可以获得的最大误差。存储的数字越大,ULP越大。”
到底是什么意思?
提前致谢
最佳答案
在浮点格式中,数字用符号s,有效数(也称为分数)f和指数e表示。例如,对于二进制浮点,由s,f和e表示的值为(-1)s•f•2e
f限制为一定数量的数字,并且通常以二进制形式要求f至少为1且小于2。可以对数字进行的最小更改(下面将讨论某些例外情况)是将f的最后一位数字修改为1。例如,如果f限制为六个二进制数字,则其值从1.00000到1.11111,并且可以进行的最小更改为0.00001。在给定指数e的情况下,f的0.00001更改将修改以0.00001•2e表示的值。这是最低精度(ULP)的单位
请注意,ULP随指数而变化。
我提到的例外发生在最大的可表示有限值(只能通过产生无穷大来增加数字),最小的(最大负数)可表示的有限值,零和次正规数(其中小数和小数发生特殊情况)。指数),以及指数变化的边界。在这些边界处,您正在减小指数,这意味着f的最低有效位的值减小,因此步长实际上是旧ULP的½。
当计算仅受浮点系统可以表示的数字限制时,结果中的最大误差为ULP的1/2。这是因为,如果从数学上精确的结果算起,您距离ULP的距离还不到1/2,则可以将计算结果更改1个ULP,以使其误差幅度减小。 (例如,如果精确结果为3.75,则从3更改为4会将错误从.75更改为.25。)
基本算术运算(例如加法,乘法和除法)应提供四舍五入到最接近可表示结果的结果,因此它们的错误最多为ULP的½。平方根也应该以这种方式实现。数学库函数(例如余弦和对数)的目标是提供良好的舍入,但是很难获得正确的舍入,因此商业库通常不保证正确的舍入。
从十进制(例如ASCII文本)到内部浮点格式的转换应正确舍入,但并非所有软件库或语言实现都可以正确执行此操作。
复合运算(例如执行许多计算以获得结果的子例程)将具有许多舍入误差,并且通常不会返回在数学上精确的结果的ULP的1/2范围内的结果。
请注意,在表示分数时,误差的大小与存储的数字的大小成正比,这在技术上并不正确。误差的界限大致成比例-我们可以说½ULP是误差的界限,而ULP则与该数字大致成比例。它仅是大致成比例的,因为它的变化范围是1到2,所以变化幅度为2(使用二进制时)。例如1和1.9375具有相同的ULP,因为它们使用相同的指数,但是ULP的比例比1.9375大1。
并且只有误差的边界是大致成比例的。实际错误取决于所涉及的数字。例如,如果我们加1和1,我们得到2且没有错误。
关于testing - 最低精度的ULP单位,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43965347/