为什么浮点数对于精确任务而言长期偏好?

时间:2013-08-19 13:18:16

标签: floating-point int long-integer precision floating-accuracy

为什么浮动首选精度?难道不是很大的整数来表示浮动给出的精度并且在所有机器上都是确定性的吗?例如,一个以浮点移动0.48124米的物体可以用一个移动48124微米的物体代表int或long。

5 个答案:

答案 0 :(得分:6)

对于某些计算,浮点优先于整数,因为:

  • 当您以定点格式相乘时,产品具有新的比例,因此必须对其进行调整,或者必须编写代码以考虑更改的比例。例如,如果采用按100缩放的格式,则.3用30表示,.4用40表示,然后将30乘以40得到1200,但在相同比例下的正确答案应为12(表示.12) )。部门需要类似的调整。
  • 当整数格式溢出时,许多机器和编程语言都没有很好的支持来获得结果中最重要的部分。浮点自动生成结果中最重要的部分,并舍弃丢弃的位。
  • 整数算术通常会截断分数,但浮点数会对它们进行舍入(除非另有要求)。
  • 某些计算涉及大量数字,包括非常大且非常小的数字。定点格式的范围很小,但浮点格式的范围很大。您可以使用定点格式手动跟踪比例,但是您只是使用整数实现自己的浮点。
  • 许多计算机和/或编程语言忽略整数溢出,但浮点可以优雅地处理这些问题和/或在发生时提供通知。
  • 浮点运算定义明确,通常实现良好;其中的错误已经减少(有时是痛苦的经历)。构建新的自己动手算法容易出错。
  • 对于某些功能,很难提前预测结果的比例,因此使用定点格式很不方便。例如,考虑正弦。每当输入接近π的倍数时,正弦接近零。因为π是无理的(和超越的),其整数或定点数接近π的倍数的模式是非常不规则的。一些定点数不接近π的倍数,它们的正弦值约为.1,.5,.9等。一些定点数非常接近π的倍数,并且它们的正弦值接近于零。少数非常接近π的倍数,并且它们的正弦很小。因此,没有合理精度的定点格式可以始终返回正弦结果,而不会出现下溢或溢出。

您询问浮点数与long。在某些情况下,64位整数可能优于32位浮点格式,但通常适当的比较是针对可比较的大小,例如32位整数到32位浮点和64位整数到64位浮点。在这些情况下,问题是动态规模的好处是否超过了几位精度的损失。

答案 1 :(得分:0)

它是481.24毫米,这是问题出现的一部分。使用整数(或长整数),你很可能遇到一种你会遇到某种四舍五入的情况。也许你的程序保证你所关心的最小单位是毫米,但它仍然导致一些丑陋的写作单位标准。不难发现100000毫米= 100米,但它不会立即显现出100000的方式,并且在一个你可能处理大多数米或公里的应用中,但你仍然需要精确度,还有更多比3463.823更难读。

此外,在很多情况下,你关心尺寸超出了不方便的小,而浮动你可以修剪你显示的数字,数据仍然存在,所以3.141592653(等等,无论浮点精度是多少)修剪到3.14米比3141592653纳米更容易处理

答案 2 :(得分:0)

确定性行为的程度是数据表示的独立。它只需要更长的规范来精确定义浮点数学而不是整数数学,并且实现起来更加混乱。

IEEE浮点努力使所有机器上的浮点确定性。

整数可以是1或2的恭维和各种宽度,因此对于某些计算而言不是确定性的。所以整数数学本身就会有麻烦。

是的,大整数可以,并且已被用作OP建议。但正如@Eric Postpischil指出的那样,F-P的好处很多。大整数用于包括密码学在内的特定情况。

关注即将出现的十进制浮点标准,以解决银行业等问题。

答案 3 :(得分:0)

虽然许多类型的代码可以比浮点更有效地使用某种固定值,但是不同类型的代码和不同的情况有不同的要求。有些情况需要存储从零到一百万的数字到千分之一的数字;其他人要求存储从零到精确到十亿分之一的数字。对于某些目的来说,几乎不适合的定点格式对其他人来说将是非常过度的。如果一种语言可以有效地支持使用以各种不同格式存储的数字,那么定点数学可以具有一些非常巨大的优势。另一方面,语言通常更容易支持一到三种浮点格式,而不是支持许多其他必要的定点格式。此外,除非语言使单个例程能够使用各种定点格式,否则使用通用数学例程往往很困难。也许编译器技术发展到足以使用各种定点类型可能是实用的,但硬件浮点技术已经发展到足以在很大程度上消除对这种事物的需求。

答案 4 :(得分:0)

实际上,在某些应用中,由于多种原因,整数是优选的。特别是,与浮点不同,整数是平移不变的:

x1 - x2 == (x1 - displacement) - (x2 - displacement)

这在某些几何引擎中非常重要。例如,如果计算由某个参数确定的相同形状的大网格,则计算相同参数的集合,并为每个集合计算其代表之一中发生的情况,并将结果复制到具有相同参数的其他形状。翻译不变性确保这种优化是忠实的。

另一方面,浮点不是翻译不变的:

0.0002 - 0.0001 != (0.0002 - 1000000) - (0.0002 - 1000000) // this example in single precision

这有时会导致难以调试的非常令人讨厌的意外。