为了账号安全,请及时绑定邮箱和手机立即绑定

浮点加法和乘法是关联的吗?

浮点加法和乘法是关联的吗?

C++
倚天杖 2019-10-21 15:20:52
当我添加三个浮点值并将它们与1进行比较时出现问题。cout << ((0.7 + 0.2 + 0.1)==1)<<endl;     //output is 0cout << ((0.7 + 0.1 + 0.2)==1)<<endl;     //output is 1为什么这些价值观会有所不同?
查看完整描述

3 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

浮点加法不一定是关联的。如果更改添加顺序,则可以更改结果。


关于该主题的标准论文是每位计算机科学家都应了解的浮点算法。它给出以下示例:


另一个灰色区域涉及括号的解释。由于舍入误差,代数的关联定律不一定适用于浮点数。例如,当x = 1e30,y = -1e30和z = 1时,表达式(x + y)+ z的答案与x +(y + z)完全不同(前者为1,后者为0) )。


查看完整回答
反对 回复 2019-10-21
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

在C或C ++中,浮点乘法不相关。


证明:


#include<stdio.h>

#include<time.h>

#include<stdlib.h>

using namespace std;

int main() {

    int counter = 0;

    srand(time(NULL));

    while(counter++ < 10){

        float a = rand() / 100000;

        float b = rand() / 100000;

        float c = rand() / 100000;


        if (a*(b*c) != (a*b)*c){

            printf("Not equal\n");

        }

    }

    printf("DONE");

    return 0;

}

在此程序中,大约30%的时间(a*b)*c不等于a*(b*c)。


查看完整回答
反对 回复 2019-10-21
  • 3 回答
  • 0 关注
  • 569 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信