IEEE浮点表示-StackOverflow

促使我在看这个问题也是stackoverflow的一个问题:
gcc为什么不优化aaaaaa为(aaa)*(aaa)
楼主的意思是向这种偶数次的幂运算,我们这样只做一半的浮点乘法不是更快吗?

对啊,我也觉得呢。。

下面就有人指出了:

Because Floating Point Math is not Associative. The way you group the operands in floating point multiplication has an effect on the numerical accuracy of the answer.
As a result, most compilers are very conservative about reordering floating point calculations unless they can be sure that the answer will stay the same, or unless you tell them you don't care about numerical accuracy. For example: the -fassociative-math
option
of gcc which allows gcc to reassociate floating point operations, or even the -ffast-math
option which allows even more aggressive tradeoffs of accuracy against speed.

Lambdageek correctly points out that because associativity does not hold for floating-point numbers, the "optimization" of aaaaaa to (aaa)(aaa)may change the value.

就像我下面会介绍的一样,浮点运算实际上是一个很复杂的东西,首先浮点数并不精确,只是用近似值去代替;
其次浮点运算里面会发生溢出,舍入的情况,导致出现意想不到的结果。

把aaaaaa优化为(aaa)*(aaa)就有可能会出错哦,所以编译器还是采取稳妥一点的思路比较好。

然后还有人补充了,即使是普通的加法运算,编译器也不会利用加法的结合性去优化(这一点下面也提到了),通俗的解释就是“大数吃小数”。

Another similar case: most compilers won't optimize a + b + c + d
to (a + b) + (c + d)
(this is an optimization since the second expression can be pipelined better) and evaluate it as given (i.e. as (((a + b) + c) + d)
). This too is because of corner cases:
float a = 1e35, b = 1e-5, c = -1e35, d = 1e-5; printf("%e %e\n", a + b + c + d, (a + b) + (c + d));
This outputs 1.000000e-05 0.000000e+00

IEEE浮点表示:

使用如下形式:


浮点表示
  • 符号s(sign)表示符号
  • 有效数significand M是一个二进制小数,它的范围在1-2间或0-1间
  • 指数exponent E是2的幂(可以是负数)
    浮点数的位被划分为三个域,以编码这些值:
  • 一个单独的符号s位直接编码s
  • k位的指数域


    指数域

    编码指数E

  • n位小数域


    小数域

    编码有效数M

在floate中,s,exp,frac分别为 1位,k=8位,n=23位
在double中,s,exp,frac分别为 1位,k=11位,n=52位

c语言中的浮点类型强制转换:

溢出与范围有关,舍入与精度有关

int->float 数字不会溢出,可能被舍入
int/float->double double范围大,所以会被精确的保留
double->float 可能溢出位无穷大,还可能被舍入
float/double->int 值向0截断,比如1.999变为1;还可能会溢出

在Intel处理器的计算机中,由于处理器内部含有寄存器,而浮点寄存器使用特殊的80位扩展精度格式。
这意味着在寄存器中存储一个值,就会在读进读出的时候产生舍入,溢出,数字的值会被改变。

使用浮点运算的时候要小心,因为浮点运算的范围和精度有限,而且浮点运算不遵守普遍的算术属性,比如结合性。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容