8

Since computers think in terms of "1" and "0" how do they calculate and represent fractions such as 7.50 ? I know Java and JavaScript and if required for the answer you can use them as an example .

Edit: I was watching this MIT video on hashing by Prof. Cormen at 46:31 seconds he explains the multiplication hash function using a modular wheel which is a unit circle with several points in it and the points denote fractions. This prompted me to ask this basic question here in SO .

4

3 回答 3

11

在计算机上表示除整数以外的数字的最常见方法是使用浮点,尤其是 IEEE 754 浮点。您可能熟悉,整数通常使用硬件位来表示二进制数字,因此物理属性(如电荷或缺电、高电压或低电压、一个方向或另一个方向的磁场)用于表示位(0 和 1),这些位的序列构成一个数字(例如 11010),我们将其解释为二进制以表示一个数字(11010 2是 16+8+2 = 26)。我们通常不会想到它,但这个数字的右侧有一个“小数点”:“11010”。当我们在它的右边有更多的位时,我们只需要小数点,它代表分数。例如,11010.11 2是 16 + 8 + 2 + 1/2 + 1/4 = 26.75。为了从整数变为浮点,我们使小数点浮动。除了表示数字的位之外,我们还有一些额外的位可以告诉我们将小数点放在哪里。

所以,我们可能有三个位,比如 010,来表示小数点的位置,而其他位,比如 1101011,来表示值。小数点位 010 可能会将小数点向左移动两个位置,从而更改“1101011”。到“11010.11”。

在单精度 IEEE 754 中,有 1 个符号位(告诉我们 + 或 -)、8 个指数位和 23 个值位(用于“有效数”或“分数”)。指数位的值 0 和 255 是特殊的。对于指数位的其他值,我们减去 127 以获得范围从 -126(小数点左移 126 位)到 127(小数点右移 127 位)的指数。有效位被解释为二进制数字,除了我们稍微修改它们:我们写“1”,然后是小数点,然后是有效位的 23 位,所以我们有类似“1.1101011000...”的内容。作为替代方案,您可以将其视为一个整数:“1”然后是 23 位,没有插入小数点,形成一个 24 位二进制数字,但指数通过额外的 23 进行调整(因此减去 150 而不是 127) .

在双精度 IEEE 754 中,有 1 个符号位、11 个指数位和 52 个有效位。

还有其他不太常见的浮点格式。一些较旧的使用十六进制作为基数(使用指数表示四位而不是一位的移位)。浮点格式的一种重要类型是十进制,其中指数表示 10 的幂。在十进制浮点中,有效位可以是二进制整数,也可以是二进制编码的十进制数(其中每四位表示十进制数字) 或者它可以是混合的(根据自定义方案,位组用于指示少量十进制数字)。

浮点数的一个重要特性是它们不能表示所有实数(当然,即使在有限范围内)甚至所有有理数。这迫使数学运算返回四舍五入为可表示数字的结果,这对于不熟悉使用浮点的人来说会带来无穷无尽的问题。这个属性反过来成为十进制浮点的一个特性:它适用于处理货币面额和其他通常以十进制操作的与人类相关的数字,因为大多数舍入错误可以通过仔细使用十进制浮点来消除。科学家和数学家更多地使用与自然相关的数字或纯数字而不是人为污染的数字,他们往往更喜欢二进制浮点,因为它更广泛可用并且得到硬件的良好支持。

还有其他方法可以在计算机中表示非整数。另一种常见的方法是定点。在定点中,一个位序列,例如 1101011,用一个已知的固定位置的小数点来解释。该位置将固定在对特定应用有用的位置。所以位 1101011 可以代表数字 11010.11 2. 定点的一个优点是它很容易用标准硬件实现。要添加两个定点数,我们只需将它们添加为整数即可。为了将两个定点数相乘,我们将它们相乘,就好像它们是整数一样,但是结果在小数点之后的位置是原来的两倍,所以我们要么移动位以进行调整,要么编写代码,使结果此类操作使用小数点后的已知位数进行解释。一些处理器有指令通过调整乘法来支持定点效果。

数字也可以缩放为整数。例如,要使用美国货币,我们只需将美元金额乘以 100,然后用整数进行所有算术运算。小数点仅在显示最终结果时插入(并在从人类读取数据时进行解释)。另一种常见的缩放比例是通过乘以 255 来表示像素强度(从 0 到 1),以便从 0 到 1 的分数适合 8 位字节。

还有软件提供扩展精度(使用几个基本算术类型的单位来提供额外的精度)或任意精度(使用动态数量的单位来提供所需的精度)。与硬件支持的算术相比,此类软件非常慢,并且通常仅用于特殊目的。此外,扩展精度具有与浮点基本相同的属性;只是舍入误差更小,没有消失。任意精度具有相同的缺陷,只是它的动态精度可能允许您将误差缩小到足够小,以便您可以获得在必要间隔内的最终结果(可能有证据证明您已经这样做了)。

另一种表示非整数的方法是使用分数。您可以存储一个分子和一个分母,并以与学校教的方式大致相同的方式进行算术运算:乘以分子和乘以分母。通过将两个分数转换为具有公分母来相加,然后添加分子。这种算术是有问题的,因为分母很快就会变大,因此您需要扩展精度或任意精度来管理它们。

您还可以用符号或复合表达式来表示数字。例如,不是将 2 的平方根存储为数值,您可以将其存储在一个数据结构中,该数据结构表示应用于数字 2 的平方根运算。使用这种表示执行除了最简单的运算之外的任何运算都需要非常复杂的软件才能管理表达式,组合它们,找到归约,等等。这种表示用于专门的数学软件,例如 Maple 和 Mathematica。

最后,你可以用任何你想要的方式来表示数字。我们的现代处理器是通用计算设备,其速度和存储容量已达到极限,因此您可以编写用字符串或数据结构或任何其他技术表示数字的算法。

于 2012-08-17T14:09:43.087 回答
4

It is a massively complex subject and can require specialist hardware depending on the size of the precision involved.

The very basic answer is that it is a x bit variable - split up 3 ways -

For example a 32 bit FP would be:

1 bit for the sign (-/+)

8 bits for the exponent (power) of 10

23 bits for the significant numbers.

Think of Excel when you put a huge FP into a cell and it does something like 1.23E-01 - what this means is 1.23 multiplied by 10 to the power -1 - in other terms 0.123.

So in binary this would be: 01000000011110110000000000000000

Broken down:

0 = sign bit - positive

010000000 - exponent - one (edit: first bit is sign bit of exponent)

11110110000000000000000 - signifant figures of 123

Anyway this is really rough and my binary is rusty so someone please correct mistakes.

于 2012-08-17T13:49:26.393 回答
1

有趣的是,我最近正在阅读与我正在研究一些金融事物并需要进行浮点运算的同一主题。我强烈推荐阅读文章What Every Computer Scientist Should Know About Floating-Point Arithmetic

还可以看看Joel Spolsky关于软件浮点数的这篇文章。

于 2012-08-17T13:28:18.760 回答