繁体   English   中英

c中的浮点运算

[英]Floating point operation in c

我们知道在C中,浮点范围从单个精度的1.xxxx * 10 ^ -38到3.xxxx * 10 ^ 38。

在我的演讲幻灯片上有这个操作:

(10^10 + 10^30) + (-10^30) ?= 10^10 + (10^30 + -10^30)
10^30 - 10^30 ?= 10^10 + 0

我想知道为什么10 ^ 10 + 10 ^ 30 = 10 ^ 30在这种情况下?
我想的是,由于FP的范围可以降到10 ^ -38并且高达10 ^ 38,所以不应该有溢出,所以`10 ^ 10 + 10 ^ 30不应该最终为10 ^ 30。

如您对问题的评论所述,存储数字的部分是有限的。 它被称为有效数。

考虑以下简单的14位格式:

[符号位] [5位指数] [8位有效数]

让'bias'为16,即如果指数为16则实际为0(所以我们得到一个好的范围或+/-幂)并且没有隐含的位

所以,如果我们的数字大于2 ^ 8,如2048和0.5

我们的格式:

2048 = 2 ^ 11 = [0] [11011] [1000 0000]

0.5 = 2 ^ -1 = [0] [01111] [1000 0000]

当我们添加这些数字时,我们移动指数,使它们具有相同的小数位。 小数的比喻是:

5×10 ^ 3 + 5×10 ^ -2 => 5×10 ^ 3 + 0.00005×10 ^ 3

所以siginifcand不能容纳12个地方:

2 ^ 11 + 0.000000000001 x 2 ^ 11 = 1.000000000001 x 2 ^ 11

所以它回到2 ^ 11

本质是有效数字的概念。 它是IEEE754 float的大约7位小数。 如果我们使用带有7位有效数字的假设十进制浮点数,则以这种方式进行计算:

10^10 + 10^30 == 1.000 000 * 10^10 + 1.000 000 * 10^30
              == (0.000 000 000 000 000 000 01 + 1.000 000) * 10^30 (match the exponent part)
              => (0.000 000 + 1.000 000) * 10^30 (round the left operand)
              ==  1.000 000 * 10^30
              == 10^30

但是请注意,匹配操作和舍入操作是作为单个步骤完成的,即。 机器永远不能处理有效数字太多的0.000 000 000 000 000 000 01 * 10^30

顺便说一下,如果你在C中对浮点算术进行实验,你可能会发现%a格式说明符很有用(在C99中引入)。但请注意, printf总是隐式地将float参数转换为double

#include <stdio.h>

int main() {
    float x = 10e10, y = 10e30;
    printf("(%a + %a) == %a == %a\n", x, y, x+y, y);
    return 0;
}

暂无
暂无

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

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