繁体   English   中英

C - 浮点舍入

[英]C - floating point rounding

我试图理解浮点数是如何工作的。

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

据我所知,这种情况会发生在x足够大的情况下,使得x + 1比x更接近x,而下一个数字高于浮点所代表的x。 如此直观地看起来就是我在有效数字中没有足够数字的情况。 这个数字x是否是有效数字为1的数字。 但后来我似乎无法弄清楚指数必须是什么。 显然它必须很大(相对于10 ^ 0,无论如何)。

你只需要用指数表示尾数中LS位的值。 当这个> 1时,你就达到了你的条件。 对于单精度浮点数,LS位的值为2 ^ -24 * 2 ^ exp,因此当exp> 24时我将满足条件,即25.满足此条件的最小(标准化)数将因此是1.0 * 2 ^ 25 = 33554432.0f。

我没有检查过这个,所以我的数学可能会偏离某个地方(例如2倍),并且FP单元也可能会超出第24位,因此可能还需要2倍的因子来计算这个,但你得到了一般的想法......

从1.0开始,并保持加倍,直到测试成功:

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

我建议在尝试理解fp数字和fp算术时,你在十进制中工作,有效数字为5位,指数为2。 (或者,如果5和2不适合你,6和3或你喜欢的任何其他小数字。)问题:

  • 可以表示的有限数字集;
  • 非交换性,非关联性和非分配性;
  • 将fp数字视为实数时可能出现的问题;

更容易理解十进制,你学到的课程是完全一般的。 一旦你弄明白这一点,用IEEE fp算法增强你的知识将是相对简单的。 您还可以相对轻松地找出其他fp算术系统。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM