【散分】VS和CB输出结果不一致

nomasp
博客专家认证
2016-01-11 09:32:02
在C++板块问过了,但是毕竟分多用不完,就来再问一次,散散分……



应该能看清的吧?点击图片可以查看大图的,我把代码再贴一遍


#include <iostream>
#include <cmath>
using namespace std;

int titleToNumber(string s) {
int n = 0, len = s.length();
for(int i = 0; i < s.length(); ++ i) {
char c = s[i];
int chara = c - 'A' + 1;
cout<<"chara = " << chara << endl;
n += chara * pow(26, len - 1 - i);
cout<<"pow = " << pow(26.0, len - 1 - i) << endl;
cout<<"n = " << n << endl;
cout<<endl;
}
return n;
}

int main() {
cout<<titleToNumber("AAB");
return 0;
}


有人说是因为cmath和math.h的原因,但是我在VS和CB中不论用哪个结果都分别是704和703,其中正确结果是704.

也有人说是因为没有转换成double,但是我在CB中转换之后结果反而成了702.

那么到底是为什么呢?求解答,求各种深入剖析,谢谢。
...全文
420 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
诺丽果 2018-03-01
  • 打赏
  • 举报
回复
版主,虽然这个帖子过去很久了,不知道现在回复你,你还能不能看见,如果可以的话,麻烦联系我一下,我有个c#的问题想请教
xuan.ye 2016-01-14
  • 打赏
  • 举报
回复
神奇。。。。。
  • 打赏
  • 举报
回复
引用 12 楼 NoMasp 的回复:
哈哈,是因为编译器版本号不一样还是因为我笔记本坏了? 要不要贴上我的计算机信息
新版本总是有点改进的。
本拉灯 2016-01-14
  • 打赏
  • 举报
回复
楼主牛B,懂汇编。
nomasp 2016-01-12
  • 打赏
  • 举报
回复
引用 3 楼 zeratul1990 的回复:
额,完全不懂编译器什么的.....调试下,把所有参数转double输出下? int n=0; n += 1* pow(26, 2); cout<<"n = " << n << endl; 或者只是这几句呢?看看为什么是675和676吧,后两次循环应该结果一样?
用double是对的,我只是不清楚为什么两个编译器为什么执行结果不一样,它们内部是如何进行的……
拜一刀 2016-01-12
  • 打赏
  • 举报
回复
额,完全不懂编译器什么的.....调试下,把所有参数转double输出下? int n=0; n += 1* pow(26, 2); cout<<"n = " << n << endl; 或者只是这几句呢?看看为什么是675和676吧,后两次循环应该结果一样?
nomasp 2016-01-12
  • 打赏
  • 举报
回复
引用 1 楼 JustinLiu27的回复:
只是编译器不一样的原因吧
那具体呢?同一个代码,同样的pow函数,仅仅因为一句编译器不一样就能输出不一样了?
Justin-Liu 2016-01-12
  • 打赏
  • 举报
回复
只是编译器不一样的原因吧
nomasp 2016-01-12
  • 打赏
  • 举报
回复
引用 13 楼 shingoscar 的回复:
换了你的4.8.1,这编辑器好像太随便了点 代码1
#include <iostream>
#include <cmath>
using namespace std;
int G3G5G7(){ return pow(26, 2); }
int main(){ return G3G5G7(); }
反汇编1
:004013E0 55                      push ebp
:004013E1 89E5                    mov ebp, esp
:004013E3 83EC18                  sub esp, 00000018
:004013E6 C744240402000000        mov [esp+04], 00000002
:004013EE C704241A000000          mov dword ptr [esp], 0000001A
:004013F5 E85E6D0000              call 00408158  ;调用的函数是strdup?????
:004013FA D97DF6                  fstcw word ptr [ebp-0A]
:004013FD 0FB745F6                movzx eax, word ptr [ebp-0A]
:00401401 B40C                    mov ah, 0C
:00401403 668945F4                mov word ptr [ebp-0C], ax
:00401407 D96DF4                  fldcw  [ebp-0C]
:0040140A DB5DF0                  fistp dword ptr [ebp-10]
:0040140D D96DF6                  fldcw  [ebp-0A]
:00401410 8B45F0                  mov eax, dword ptr [ebp-10]
:00401413 C9                      leave
:00401414 C3                      ret
代码2
#include <iostream>
#include <cmath>
//此处去掉了using
int G3G5G7(){ return pow(26, 2); }
int main(){ return G3G5G7(); }
反汇编2
:004013E0 55                      push ebp
:004013E1 89E5                    mov ebp, esp
:004013E3 B8A4020000              mov eax, 000002A4  ;居然在编译阶段已经算好了676
:004013E8 5D                      pop ebp
:004013E9 C3                      ret
多谢,受教了!
Poopaye 2016-01-12
  • 打赏
  • 举报
回复
换了你的4.8.1,这编辑器好像太随便了点 代码1
#include <iostream>
#include <cmath>
using namespace std;
int G3G5G7(){ return pow(26, 2); }
int main(){ return G3G5G7(); }
反汇编1
:004013E0 55                      push ebp
:004013E1 89E5                    mov ebp, esp
:004013E3 83EC18                  sub esp, 00000018
:004013E6 C744240402000000        mov [esp+04], 00000002
:004013EE C704241A000000          mov dword ptr [esp], 0000001A
:004013F5 E85E6D0000              call 00408158  ;调用的函数是strdup?????
:004013FA D97DF6                  fstcw word ptr [ebp-0A]
:004013FD 0FB745F6                movzx eax, word ptr [ebp-0A]
:00401401 B40C                    mov ah, 0C
:00401403 668945F4                mov word ptr [ebp-0C], ax
:00401407 D96DF4                  fldcw  [ebp-0C]
:0040140A DB5DF0                  fistp dword ptr [ebp-10]
:0040140D D96DF6                  fldcw  [ebp-0A]
:00401410 8B45F0                  mov eax, dword ptr [ebp-10]
:00401413 C9                      leave
:00401414 C3                      ret
代码2
#include <iostream>
#include <cmath>
//此处去掉了using
int G3G5G7(){ return pow(26, 2); }
int main(){ return G3G5G7(); }
反汇编2
:004013E0 55                      push ebp
:004013E1 89E5                    mov ebp, esp
:004013E3 B8A4020000              mov eax, 000002A4  ;居然在编译阶段已经算好了676
:004013E8 5D                      pop ebp
:004013E9 C3                      ret
nomasp 2016-01-12
  • 打赏
  • 举报
回复
引用 11 楼 shingoscar 的回复:
编译器是gcc4.9




哈哈,是因为编译器版本号不一样还是因为我笔记本坏了?

要不要贴上我的计算机信息
Poopaye 2016-01-12
  • 打赏
  • 举报
回复
编译器是gcc4.9
Poopaye 2016-01-12
  • 打赏
  • 举报
回复

经鉴定,你电脑坏了
nomasp 2016-01-12
  • 打赏
  • 举报
回复
引用 6 楼 shingoscar 的回复:
意思就是把26.0改成26就不一样了?
对的,同一个代码在VS和CB不一样的情况这已经是我最近碰到的第二次了……VS确实更科学
  • 打赏
  • 举报
回复
引用 6 楼 shingoscar 的回复:
意思就是把26.0改成26就不一样了?
意思是有一个工具,它编译出来的代码没有选择误差小的操作,而是把误差随便扩大。因为选择的工具不同,所以误差很大。
  • 打赏
  • 举报
回复
这说明微软的东西更科学。不解释。
Poopaye 2016-01-12
  • 打赏
  • 举报
回复
意思就是把26.0改成26就不一样了?
xdashewan 2016-01-12
  • 打赏
  • 举报
回复
这东西你要那么看,pow(26, 2);这个结果两边是否一致,如果一致说明pow本身没有问题,错就在其他运算。如果pow结果不同,那么按照正常数学逻辑,26*26 = 676才是正确的。按照此逻辑依次类推你业务里的所有算数式,找到不同的节点再分析

7,774

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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