VC6.0下debug和release下结果不一致问题?

yueyucanyang 2010-05-26 02:48:51

#define PI 3.1415926
int main(void)
{
float num1;
float num2;
float val;
int i;

val = 0;
for(i = 1; i < 100; i ++)
{
num1 = 6548.5f*i/PI;
num2 = 22234.44/i*PI;
val += num2*num1;
}

printf("%x\n", *((unsigned long*)&val));


return 0;
}


上面代码在debug下输出5056cb73,在release下输出5056cb6a。

怀疑:
1.release下将浮点运算转化为double型运算

问题:
1.debug下和release下是如何进行浮点运算的?其中release下采用速度优化。
2.如何修改代码,使其输出结果保持一致?
...全文
320 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
lqbk1 2010-06-05
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 icansaymyabc 的回复:]
一、

printf("%x\n", *((unsigned long*)&val));

完全等同于

printf("%x\n", val);

没有必要像你那样多此一举。



二、

你提出在这个现象仅仅在你一个人的电脑上如此表现,在别人的电脑上不会是这样的。事实上,除非你自己设置了一些影响精度的优化选项,MS总能保证Debug和Release下结果一致……
[/Quote]
关于第二点,其实不一定……
debug和release可能会使用不同的浮点库,运算精度可能会不一样……
yueyucanyang 2010-06-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 z569362161 的回复:]
谁告诉你地址每次都一样了。
[/Quote]
仔细看看,我输出的不是地址,而是地址里边的数据。
yueyucanyang 2010-06-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 logiciel 的回复:]
如果所有数据和变量的类型都是double,那么debug和release的输出一样,都是441D47B4.
[/Quote]
如果都是double型的,数据不应该按照这种方式取出了,因为数据时double是64位的,要取出两个32位数据才能知道是否正确,我上面的程序只是针对float如果是double就要修改了。
yueyucanyang 2010-06-05
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 icansaymyabc 的回复:]
一、

printf("%x\n", *((unsigned long*)&val));

完全等同于

printf("%x\n", val);

没有必要像你那样多此一举。



二、

你提出在这个现象仅仅在你一个人的电脑上如此表现,在别人的电脑上不会是这样的。事实上,除非你自己设置了一些影响精度的优化选项,MS总能保证Debug和Releas……
[/Quote]

兄弟,你最好测试一下。
Lee723 2010-06-01
  • 打赏
  • 举报
回复
学习了。
icansaymyabc 2010-06-01
  • 打赏
  • 举报
回复
一、

printf("%x\n", *((unsigned long*)&val));

完全等同于

printf("%x\n", val);

没有必要像你那样多此一举。



二、

你提出在这个现象仅仅在你一个人的电脑上如此表现,在别人的电脑上不会是这样的。事实上,除非你自己设置了一些影响精度的优化选项,MS总能保证Debug和Release下结果一致。


linglongyouzhi 2010-06-01
  • 打赏
  • 举报
回复
显然是3楼所说的原因
logiciel 2010-06-01
  • 打赏
  • 举报
回复
LZ程序中的val按float格式在debug和release下的输出都是1.44146e+010,这是否意味按unsigned long格式出现的差异对于float类型的精度而言是可以忽略的?
logiciel 2010-06-01
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yueyucanyang 的回复:]
引用 6 楼 logiciel 的回复:
如果所有数据和变量的类型都是double,那么debug和release的输出一样,都是441D47B4.


这个说的没错,我之前也已经测试过了。能否不修改数据类型就可以呢。
[/Quote]

好象不行.请参考我的分析:http://blog.csdn.net/logiciel/archive/2010/05/28/5631582.aspx
yidasoft 2010-05-31
  • 打赏
  • 举报
回复
在运算时候对类型做了转换
wade_2003 2010-05-31
  • 打赏
  • 举报
回复
所有的变量都初始化了试试
yueyucanyang 2010-05-31
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 logiciel 的回复:]
如果所有数据和变量的类型都是double,那么debug和release的输出一样,都是441D47B4.
[/Quote]

这个说的没错,我之前也已经测试过了。能否不修改数据类型就可以呢。
logiciel 2010-05-26
  • 打赏
  • 举报
回复
如果所有数据和变量的类型都是double,那么debug和release的输出一样,都是441D47B4.
logiciel 2010-05-26
  • 打赏
  • 举报
回复
对不起!上面错了!
logiciel 2010-05-26
  • 打赏
  • 举报
回复
以下形式在release下也输出5056cb73:

//num1 = 6548.5f*i/PI;
//num2 = 22234.44f/i*PI;
val += (6548.5f*i/PI)*(22234.44f/i*PI);

z569362161 2010-05-26
  • 打赏
  • 举报
回复
谁告诉你地址每次都一样了。
东莞某某某 2010-05-26
  • 打赏
  • 举报
回复
优化从多方面展开
学习了。
localxiao 2010-05-26
  • 打赏
  • 举报
回复
#define PI 3.1415926 => #define PI 3.1415926f


num2 = 22234.44/i*PI; => num2 = 22234.44f/i*PI;

69,390

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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