C-浮点舍入

C-浮点舍入,c,floating-point,rounding,C,Floating Point,Rounding,我想了解浮点数是如何工作的 我想我想通过评估以下内容来测试我知道/需要学习的内容:我想找到最小的x,这样x+1=x,其中x是一个浮点数 据我所知,如果x足够大,使得x+1比下一个大于x的数字更接近x,则会发生这种情况。直观地看,我的有效位中没有足够的数字。那么这个数字x是有效位都是1的数字吗。但我似乎不知道指数应该是多少。显然,它必须很大(无论如何,相对于10^0) 从1.0开始,一直加倍,直到测试成功: double x; for (x = 1.0; x + 1 != x; x *= 2) {

我想了解浮点数是如何工作的

我想我想通过评估以下内容来测试我知道/需要学习的内容:我想找到最小的
x
,这样
x+1=x
,其中
x
是一个浮点数


据我所知,如果
x
足够大,使得
x+1
比下一个大于x的数字更接近x,则会发生这种情况。直观地看,我的有效位中没有足够的数字。那么这个数字x是有效位都是1的数字吗。但我似乎不知道指数应该是多少。显然,它必须很大(无论如何,相对于10^0)

从1.0开始,一直加倍,直到测试成功:

double x;
for (x = 1.0; x + 1 != x; x *= 2) { }
printf("%g + 1 = %g\n", x, x + 1);

您只需要用指数表示尾数中LS位的值。当该值大于1时,表示您已满足条件。对于单精度浮点,LS位的值为2^-24*2^ exp,因此exp大于24时,即25时,将满足条件。因此,满足该条件的最小(标准化)数字为1.0*2^25=33554432.0f


我没有检查这一点,因此我的数学可能在某个地方出现偏差(例如,系数为2),并且FP单位也可能在第24位之后进行舍入,因此可能需要进一步的系数2来解释这一点,但是你得到了一个大致的想法…

我建议,在试图理解f-p数字和f-p算术时,你使用十进制,有效位为5位,指数为2位。(或者,如果5和2不适合您,6和3或您喜欢的任何其他小数字。)以下问题:

  • 可表示的有限数字集
  • 非交换性、非结合性和非分配性
  • 将f-p数视为实数时可能出现的问题

所有这些都很容易用十进制计算出来,而且你所学到的课程都是很一般的。一旦你弄明白了这一点,增强你的IEEE f-p算法知识将相对简单。您还可以相对轻松地算出其他f-p算术系统。

尝试一下并不意味着我理解为什么:)我宁愿先把它理出来。我猜这篇文章更笼统地讲的是如何将舍入合并到浮点数学中,正如我提出的示例问题所证明的那样。哦,伙计,当你发布这篇文章时,我真的算出了正确的答案!美好的实际上,x=2^24是满足条件的第一个浮点(任何大于2^24-1的浮点都需要25位,因此超过一个浮点所能精确容纳的位数)。在尾数之外可能有一些你看不到的粘性位,用于四舍五入,这取决于数字进入寄存器的方式(通过int到float或通过float+float(1.0)等)可能会有细微的差异,因此它可能是24、25或26位,但在该范围内的某个地方,您会将尾数末尾的一位推到以太中。@dwelch:我很确定它会发生在25位范围内;如果不是2^24(在我的测试中它适用于2^24)25位整数必须舍入为偶数(16777216、16777218、16777220、16777222,…),所以这些都是x的候选项。如果所有的2^23个都加上1,那么要从x取整,你就必须非常不走运!我假设一些FPU在这方面有所不同,我已经很久没有看过规范了,看看它是否有关于这方面的细节了。从理论角度来看,你至少还需要再多看一点来做roun丁。回答具体问题也取决于X,取整1加上正确的数字将取整到尾数,其他取整模式不会。也许我们已经把这匹马打死了,海报对指数尾数的理解足够好。正如你所问,减去无穷大:-)你可能想要最小的正数,而不是最小的数。