有很多方法可以在计算机中存储给定的数字。这个site列出了5
我能想到另一个。对Ascii中的所有内容进行编码,并根据需要使用负号(45)和句点(46)编写数字。
我不确定我是在混合苹果和橙子,但今天我听说计算机如何使用single and double precision floating point format存储数字。在这一切中,所有内容都被写成2的幂乘以分数。这意味着不是像9这样的2的幂的数字被写为2的幂乘以一个分数,例如9 ➞ 16*9/16
。这是对的吗?
谁决定使用哪个系统?是由计算机的硬件还是程序决定的?计算机代数系统如何在有限的机器上处理像π这样的转义数?如果所有内容都用Ascii编码并且负号和小数相应地放置,例如,事情会变得容易得多。 -15.2将是45 49 53 46(基数为10) ➞ 111000 110001 110101 101110
答案 0 :(得分:0)
这里有很多问题。
你想象的系统的主要原因是坏的,是因为缺乏熵。 ASCII字符是8位,因此不是2 ^ 32个可能的整数,而是32位上只能表示4个字符,因此10000个整数值(如果需要,则为1000个负数)。即使你减少到12个代码(0-9, - ,.),你仍然需要4位来存储它们。所以,10 ^ 8 + 10 ^ 7个整数值,仍然远小于2 ^ 32(记住,2 ^ 10~10 ^ 3)。使用二进制是最佳的,因为我们的位只有2个值。任何2的幂的基数也是有意义的,因此八进制和十六进制 - 但最终它们只是二进制,每3或4包装的位用于可读性。如果您忘记了符号(只使用一位)和小数分隔符,则会得到BCD:二进制编码的十进制数,通常编码为每位4位,尽管似乎存在称为未压缩BCD的8位版本。我确信通过一些研究,您可以使用BCD找到固定或浮点数。
将符号放在前面就是符号大小(没有熵问题,因为它的大小恒定为1位)。
您对浮点数的分数大致正确。这些数字用尾数m和指数e写成,它们的值是m 2 ^ e。如果你用这样的方式表示一个整数,比如8,它将是1x2 ^ 3,那么分数是1 = 8/2 ^ 3。由于9这个分数不能完全表示,所以我们用可用位写出最接近的数字而不是1。这就是我们所做的以及非理性(以及超然的)数字,如Pi:我们近似。
即使对于浮点值,您也无法使用此系统解决任何问题。分母将是10的幂而不是2的幂,这对你来说似乎更自然,因为这是我们编写舍入数字的通常方式,但不是更有效或更准确。 **以1/6为例,你不能用a / 10 ^ b形式的有限位数来表示它。 *
负数最受欢迎的表示是2的补码,因为它在添加负数和正数时具有很好的属性。
标准委员会(在内部和最终争论很多)决定浮点数的复杂数字格式,以及如何始终如一地处理角落案例。例如。应该除以0得到NaN?无穷 ?例外?您应该查看IEEE:www.ieee.org。有些委员会甚至还没有同意,例如关于如何表示区间算术的间隔。最终,人们让处理器最终了解如何将位解释为数字。但是坚持标准允许不同处理器(或协处理器)之间的可移植性和兼容性,如果你的GPU使用不同的数字格式怎么办?除了复制数据之外你还有更多工作要做。
存在浮点值的许多替代方法,如定点或任意精度数,对数数系统,有理算术......
*由于2除以10,你可能会认为a / 2 ^ b所代表的所有数字都可以是a5 ^ b / 10 ^ b,因此需要近似的数字较少。这仅仅涵盖了有理数的一个微小的家族(理想的,真的),这是一组无限的数字。因此,对于许多理性数字以及所有无理数(如Pi),它仍然无法解决近似问题。
**事实上,由于我们使用2的幂,我们在小数分隔符之后包含比10的幂更多的有效数字(对于相同的位数)。也就是说,2 ^ - (53 + e),指数为e的双尾数的最小位,远小于53位ASCII或4位基数10位数所能达到的位数:最多10 ^ -4 * 2 ^ -e