float问题~~

1982pc 2005-03-30 08:07:23
昨天做了一套笔试题,有一题不太懂特向高手请教!
题大概是这样,有三个float类型的数a,b,c.问 (a + b) + c == (b + a) + c 和 (a + b) + c == a + (b + c)这个两个比较的结果是多少?
本人不知道,说的是结果不确定,因为浮点数比较应该用其精度做为一个误差范围比较!
...全文
114 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
nullw 2005-03-30
  • 打赏
  • 举报
回复
支持arrowcy(长弓手)
tfq 2005-03-30
  • 打赏
  • 举报
回复
计算机位数有限,故计算的时候可能丢失某些位,会出现大数吃小数等情况。
两个数相加应该是朝着精度高的数对齐的吧,即精度低的转为跟精度高的一样的精度,故交换律是满足的,结合律不一定
晨星 2005-03-30
  • 打赏
  • 举报
回复
刚刚做了个试验,多次随机产生100组,数量级相差恰好在double的精度范围(15位)附近的浮点数,验证交换率成立。(数量级相差太大就不用验证了,小的肯定被忽略,结果于是肯定相等)。
——主观感觉也应该是成立的,浮点数加法电路应该是个对称电路,对阶过程应该仅仅根据数量级的差,而不会受谁在前,谁在后的影响。谁加到谁头上都一样。

#include <iostream>
using namespace std;
#include <stdlib.h>
#include <time.h>

int main()
{
srand(time(0));
for(int i = 0; i < 100; i++)
{
double big = (double)rand() * rand();
double small = 0.1 / rand();
cout << "Big: " << big << " Small: " << small << " Result:";
if(big + small == small + big)
cout << "==";
else
cout << "!!!!!!!!!!!!!!!!=";
cout << endl;
}
}
1982pc 2005-03-30
  • 打赏
  • 举报
回复
谢谢结贴!
arrowcy 2005-03-30
  • 打赏
  • 举报
回复
就是精度,也就是说如果最后两个加起来与另一个大数相比刚好满足可以计算的精度,而单独一个与另一个大数加就被忽略了,那交换率就不成立了
实际上steedhorse(晨星) 的那个例子就是这种情况
1982pc 2005-03-30
  • 打赏
  • 举报
回复
回 arrowcy(长弓手):
你说的大小是精度吧?
1982pc 2005-03-30
  • 打赏
  • 举报
回复
两颗星星果然不是浪得虚名!
arrowcy 2005-03-30
  • 打赏
  • 举报
回复
交换相加,两个加数都要损失相同的精确度
结合的话,如果是 大+小+小
大+小 有可能刚好小的被忽略了
而 小+小 这两个加起来得到一个略大
这个 略大+大,可能刚好略大有一位被加上去了
不知道你能看懂我这个意思不?
1982pc 2005-03-30
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<iostream.h>
void main()
{
float a,b,c;
cout << ((a + b) + c == (b + a) + c)<<endl;
cout << (a + (b + c) == (a + b) + c)<<endl;
}
在VC++下
输出结果均为1啊!
晨星 2005-03-30
  • 打赏
  • 举报
回复
这个例子至少说明结合率不满足:

#include <iostream>
using namespace std;

int main()
{
double d1 = 1.5e16;
double d2 = 1.0;
double d3 = 1.0;

int result1 = ((d1 + d2) + d3 == (d2 + d1) + d3);
int result2 = ((d1 + d2) + d3 == d1 + (d2 + d3));

cout << "Result1 = " << result1 << endl;
cout << "Result2 = " << result2 << endl;

return 0;
}
1982pc 2005-03-30
  • 打赏
  • 举报
回复
没说数值~~~~
回steedhorse(晨星)
能不能说得肯定点啊?!

ywhbn 2005-03-30
  • 打赏
  • 举报
回复
a,b,c 的数值是什么?
晨星 2005-03-30
  • 打赏
  • 举报
回复
是的。
在我的概念里头,浮点数运算部件应该还是可以满足交换率的。
1982pc 2005-03-30
  • 打赏
  • 举报
回复
楼上什么意思,交换的话相等?结合的不相等?
晨星 2005-03-30
  • 打赏
  • 举报
回复
我感觉交换率应该还是可以满足的,结合率应该不行。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧