首页 文章

在16位,32位和64位IEEE-754系统中可以表示哪些数字?

提问于
浏览
65

我知道浮点数是如何表示的,但是还不够,我害怕 .

一般问题是:

对于给定的精度(就我的目的而言,基数为10的精确小数位数),16位,32位和64位IEEE-754系统可以表示哪些数字范围?

具体来说,我只对准确到/-0.5(那些地方)或/ - 0.0005(千分之一地方)的16位和32位数字的范围感兴趣 .

7 回答

  • 2

    我从MATLAB文档中为函数EPS绘制了这个答案,但它应该普遍适用于IEEE-754浮点数 .

    对于给定的浮点数 X ,如果

    2^E <= abs(X) < 2^(E+1)
    

    那么从 X 到下一个最大可表示浮点数( epsilon )的距离是:

    epsilon = 2^(E-52)    % For a 64-bit float (double precision)
    epsilon = 2^(E-23)    % For a 32-bit float (single precision)
    epsilon = 2^(E-10)    % For a 16-bit float (half precision)
    

    上述等式允许我们计算以下内容:

    如果您想要准确度为/-0.5(或2 ^ -1),则该数字的最大大小为2 ^ 10 . 大于此值且浮点数之间的距离大于0.5 .

    如果您想要精确度为/-0.0005(约2 ^ -11),则该数字的最大大小为1.任何大于此值且浮点数之间的距离大于0.0005 .

    如果您想要准确度为/-0.5(或2 ^ -1),则该数字的最大大小为2 ^ 23 . 大于此值且浮点数之间的距离大于0.5 .

    如果您想要准确度为/-0.0005(约2 ^ -11),则该数字的最大大小为2 ^ 13 . 任何大于此值的浮点数之间的距离都大于0.0005 .

    如果您想要精确度为/-0.5(或2 ^ -1),则该数字的最大大小为2 ^ 52 . 大于此值且浮点数之间的距离大于0.5 .

    如果您想要准确度为/-0.0005(约为2 ^ -11),则该数字的最大大小为2 ^ 42 . 任何大于此值的浮点数之间的距离都大于0.0005 .

  • 21

    对于浮点整数(我将根据IEEE双精度给出我的答案),1到2 ^ 53之间的每个整数都是完全可表示的 . 超过2 ^ 53,可精确表示的整数通过增加2的幂来间隔开 . 例如:

    • 可以精确表示2 ^ 53 2和2 ^ 54之间的每个第2个整数 .

    • 可以精确表示2 ^ 54 4和2 ^ 55之间的每4个整数 .

    • 可以精确表示2 ^ 55 8和2 ^ 56之间的每第8个整数 .

    • 可以精确表示2 ^ 56 16和2 ^ 57之间的每个第16个整数 .

    • 可以精确表示2 ^ 57 32和2 ^ 58之间的每个第32个整数 .

    • 可以精确表示2 ^ 58 64和2 ^ 59之间的每个第64个整数 .

    • 可以精确表示2 ^ 59 128和2 ^ 60之间的每个第128个整数 .

    • 可以精确表示2 ^ 60 256和2 ^ 61之间的每256个整数 .

    • 可以精确表示2 ^ 61 512和2 ^ 62之间的每个第512个整数 . . . .

    不完全可表示的整数被舍入到最接近的可表示整数,因此最坏情况舍入是可表示整数之间的间距的1/2 .

  • 0

    精确引用的形式Peter R与MSDN ref的链接可能是一个很好的经验法则,但当然现实更复杂 .

    "floating point"中"floating point"是二进制点而不是小数点的事实有一种方法可以打败我们的直觉 . 典型的例子是0.1,它需要十进制中只有一位数的精度,但根本不能用二进制表示 .

    如果你有一个周末杀人,看看What Every Computer Scientist Should Know About Floating-Point Arithmetic . 您可能对PrecisionBinary to Decimal Conversion的各个部分特别感兴趣 .

  • 17

    首先,IEEE-754-2008和-1985都没有16位浮点数;但它是一个具有5位指数和10位分数的建议加法 . IEE-754使用专用符号位,因此正负范围是相同的 . 此外,该分数在前面有一个隐含的1,所以你得到一个额外的位 .

    如果你想要精确到那个地方,就像你可以表示每个整数一样,答案很简单:指数将小数点移动到分数的右端 . 所以,一个10位的分数可以得到±211 .

    如果你想要小数点后的一位,你先放弃一位,所以你有±210 .

    单精度具有23位分数,因此您有±224个整数 .

    小数点后需要多少精度位完全取决于您正在进行的计算以及您正在进行的计算 .

    • 210 = 1,024

    • 211 = 2,048

    • 223 = 8,388,608

    • 224 = 16,777,216

    • 253 = 9,007,199,254,740,992(双精度)

    • 2113 = 10,384,593,717,069,655,257,060,992,658,440,192(四精度)

    另见

  • 93

    IEEE 754-1985

    v = (-1)^sign * s^(exponent-exponent_bias) * (1 + fraction)

    注意(1分数) . 由于@bendin指出,使用二进制浮点数,不能表示简单的十进制值,如0.1 . 这意味着您可以通过多次简单添加或调用截断等操作来引入舍入错误 . 如果您对任何类型的精度感兴趣,实现它的唯一方法是使用定点十进制,它基本上是一个缩放的整数 .

  • 4

    如果我正确理解您的问题,则取决于您的语言 .
    对于C#,请查看the MSDN ref . Float具有7位精度和双15-16位精度 .

  • 0

    我花了很长时间才弄清楚在Java中使用双精度时,我的计算精度并没有下降 . 浮点实际上具有非常好的能力来表示数字到相当合理的精度 . 我将丢失的精度立即转换为用户输入的 decimal 数字到本机支持的 binary 浮点表示 . 我've recently started converting all my numbers to BigDecimal. BigDecimal is much more work to deal with in the code than floats or doubles, since it'不是原始类型之一 . 但另一方面,我将能够准确地表示用户输入的数字 .

相关问题