浮点数和整数....?

5
为什么处理器需要整数和浮点数?谢谢。

1
我认为这是一个好问题。当你在业务领域足够长时间后,会把某些事情视为理所当然。偶尔质疑自己的假设是个好主意。 - Mark Ransom
1
我点赞了这个问题。虽然它可能像作业,但它确实引发了一场小规模的讨论风暴,而且我认为并不是所有参与讨论的人都是学生。我知道我不是,尽管今天我在家工作。 - High Performance Mark
7个回答

2
整数用于计数,浮点数用于计算。在数学中,我们称它们分别为整数和实数,因此我们在算法和程序中也需要它们。故事结束。
当然,大多数浮点数实现的范围比大多数整数实现的范围更大,但是我可以发明一种语言,在该语言中允许512位整数,但只允许16位浮点数(1个符号位,3个指数位,12个有效数字位)。整数仍然不支持除法,而浮点数对于计数也毫无用处,因为虽然fp数上有继承函数,但实数上没有,而我们喜欢假装fp数是实数的一种近似实现。
不,整数对处理器来说并不更容易,处理器对位执行基本的布尔逻辑操作。如果X1处理器执行整数算术比执行fp算术快,那么搜索内存将找到反例。
我们甚至不需要使用fp数表示分数,我们可以使用整数对来表示分子和分母。
整数的绝对精度是我们使用它们进行计数的原因。对于所有实际目的而言,现有fp实现的精度已足够(现在,这是一个引起争议的荒唐主张!)
问候
马克

1
FP数并非实数。请不要让OP或他人产生这种想法。正如你所提到的,FP数在除法上不是封闭的。无穷大是浮点数,但既不是实数也不是整数。 - Potatoswatter
1
浮点数在除法运算下是绝对封闭的。当你将两个浮点数相除时,你会得到另一个浮点数值,总是如此,它可能与实数相除的结果不完全相等,但这不是“封闭”的意思。浮点数值的除法计算已经定义 包含四舍五入。 - Stephen Canon
哦,我认为这里有一个微妙的术语问题。Potatoswatter说“FP number”,而Stephen说“floating point value”。那NaN呢?它是浮点变量可以持有的值,但据其自己承认,它不是一个数字。浮点数在除法下封闭,但浮点变量的在除法下是封闭的,对吧? - Ken

0

它们只是数字,因此您可能认为您不需要区分。但是,在许多语言中,当进行整数运算时,可以进行优化-加法、减法、乘法和除法都可以使用CPU指令进行。同样,有一些指令可以对浮点数执行类似的操作,但由于机器中表示的数字不同,并且操作也不同,因此将处理器中明显的整数和浮点数之间的区别提升到编程语言本身中是有意义的。

C#、Java、C ++和其他语言都具有用于处理整数和浮点数的不同类型。Javascript则做出了相反的选择-没有特殊的整数类型,如果我没有弄错的话,所有数字都是浮点数。


关于为什么需要整数和浮点数 - 浮点数允许更广泛的值范围,尽管在极端情况下(例如,天文数量)精度会降低。在浮点数运算中无法精确表示1.37999933247474x10e24。另一方面,整数为一组固定数字提供了精度和速度。

0

整数对处理器资源来说更容易,通常更快。这在许多年前是个大问题,当时的处理器甚至没有内置的浮点功能。现在不太一样了,但在紧凑代码中仍然可以显著影响差异。

整数通常是你所需要的全部。


0

浮点数的范围比整数大得多。此外,它们可以表示分数值。然而,这些功能是以精度损失为代价提供的。

编辑:(我所说的“精度损失”是什么意思)
整数算术始终是精确的,只要不提供导致溢出或除以零的操作数。
但是,在使用浮点算术时,可能会丢失某些值的部分,当在简单操作中使用这些值时。原因是浮点值提供了巨大的范围,因此在给定(相对较小的)存储器(通常为8或16字节)内无法表示所有连续值。


1
不总是。64位双精度浮点数比32位整数具有更高的精度。 - Mark Ransom
无论变量多大,整数值始终在其范围内 100% 准确。这与浮点值不同,后者可能包含在其范围内的一些部分,在进行各种甚至简单的计算时将丢失。 - mjv
1
@mjv:任何确定性数字系统在其规范内都是100%精确的。您是否在说int a = 1/2;在小学算术方面是100%精确的? - Potatoswatter
@Potatoswatter 也许“确定性数字系统”是正确的关键词。浮点算术只是不确定性的。无论如何,High-Performance Mark提供了最好的综合答案:“我们的工作完成了”;-) - mjv
@Potatoswatter:如果你避免溢出和除法不产生整数结果,任何数学恒等式都将成为整数算术中的恒等式。C语言中的无符号整数类型形成了一个完美的数学环。浮点加法甚至不是结合律。 - David Thornley
显示剩余2条评论

0

整数是编程任务中最常用的东西。它们可以表示内存地址。从一个整数到下一个整数很容易计算:只需加一。

浮点数值用于近似实数。实数是连续数学中最常见的事物。连续数学用于表示现实世界。(因此术语“实数”)

浮点数通常不能用作整数。您无法轻松地从X计数到比X大的下一个数字。它们会四舍五入,而且不能保证X + 1甚至是与X不同的数字。一般来说,即使表达式应该相等,如果它们是由不同的操作序列产生的,则两个浮点数可能是不同的。

浮点数就像现实生活一样不可预测。整数像计算机一样有序和高效。


浮点数是完全可预测的。当你让计算机将 1e-32 加到 1e+32 时,它不会返回一个随机数。这只是不简单,对于普通用户来说肯定不直观。你必须学习相关的实现标准,并愿意在需要时在纸上解决细节问题。 - Charles E. Grant
现实生活中的某些方面也是可以预测的,并且随着更多分析变得更加可预测。这就是一个类比。 - Potatoswatter

0
在大多数应用程序中,可以通过仔细定义需要以何种精度表示的值范围,并使用适当的缩放因子进行乘法运算,将浮点数替换为整数。然而,这需要额外的开发工作,只有在小型嵌入式平台(即小型微控制器)无法在可用时间内执行浮点算术计算时才值得进行。
使用浮点数,您可以在大多数情况下不考虑值的表示方式,只要保持在可用范围和精度内即可。不幸的是,这相当危险,因为这样做可能会导致您没有注意到离开安全区域的情况。

0
一个稍微不同的观点:整数适用于数字量,而浮点数适用于模拟量。比如,在码头观察船只时,使用整数计算船只数量,使用浮点数表示水位。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接