![]() |
1
2
您需要了解浮点数字在CPU中是如何表示的。在数据类型中,符号保留1位,即无论是正数还是负数(可以在浮点数中有正数和负数0),则有效位(或尾数,)这些是浮点数中的有效数字,最后为指数保留了一些位。现在浮点数的值是: -1^符号*有效位*2^指数
查看这些维基百科页面 IEEE754 和 Machine epsilon 一些背景信息。 |
![]() |
2
4
ε
epsilon是可以添加到1.0的最小值,并产生可与1.0区分的结果。正如poita_u所暗示的,这对于处理舍入误差很有用。这种情况非常简单:一个普通的浮点数的精度是固定的,不管它的大小。换言之,它总是计算相同数量的有效数字。例如,一个典型的
有意义地使用epsilon通常需要将其缩放到您正在使用的数字的范围,并使用该范围来定义一个您愿意接受的范围,这可能是由于舍入误差所致,因此,如果两个数字在该范围内,您假设它们可能真的相等。例如,当epsilon为1e-15时,您可能决定将彼此在1e-14范围内的数字视为相等(即在有效数字上舍入)。
可以表示的最小数字通常会大大小于这个数字。同样的典型
在这种情况下,比例因子是固定的,因此两个数字之间可以表示的最小差异也是固定的,即1024和下一个较大数字之间的差异与0和下一个较大数字之间的差异完全相同。 倒数我不清楚你为什么关心计算非常大或非常小的数字的倒数。ieee浮点使用非规范化,这意味着接近范围限制的数字将失去精度。基本上,数字分为指数和有效位。指数包含数字的大小,有效位包含有效数字。每一个都用指定的位数表示。在通常情况下,数字是标准化的,这意味着它们与我们在学校学到的科学符号有点相似。在科学记数法中,你总是调整有效位和指数,这样小数点前正好有一个位置,所以(例如)140变成1.4e2,20030变成2.003e4,依此类推。 把它看作浮点数的“标准化”形式。然而,假设你的指数是有限的,只有两位数,所以它只能从-99到+99。还假设您最多可以有15个有效数字。在这些限制内,您可以生成0.0000102E-99这样的数字。这让你可以表示一个小于1e-99的数字,以牺牲一些精度为代价——你用了有效位的5位数来表示大小,而不是15位数的精度,所以你只剩下10位真正有意义的数字。 除了它是二进制的,而不是十进制的,ieee浮点基本上就是这样工作的。 当你接近范围的末尾时,数字的精度越来越低,直到(在范围的最末端)你只剩下一点精度。 如果你取一个只有一位精度的数字,取其倒数,你会得到一个非常大的数字——但是由于你只从一位精度开始,结果也只能有一位精度。虽然总比没有结果好一点,但它仍然几乎毫无意义。你已经达到了位数所能表示的极限;解决这个问题的唯一方法就是使用更多的位数。 实际上,没有任何一个点的倒数(或其他计算)“停止有意义”。一个结果有意义,另一个没有意义,这并不是一条硬线,而是一个斜率,其中一个结果可能有15位数的精度,另一个10位数,第三个只有1位数。“有意义”与否主要是你如何解释这个结果。为了得到有意义的结果,你需要知道你最终结果中有多少数字是真正有意义的。 |
![]() |
3
1
|
![]() |
MaPo · Linux,设置锁定ICMP_过滤器选项 7 月前 |
![]() |
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 7 月前 |
![]() |
Bobby · 复合字面值总是左值吗? 8 月前 |
![]() |
9-Pin · C: 嵌套结构的堆栈内存分配 8 月前 |