鱼C论坛

 找回密码
 立即注册
查看: 1763|回复: 14

[已解决]相同程序在windows的devc++和ubuntu下求出的结果为什么不一样

[复制链接]
发表于 2022-1-4 09:55:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include <stdio.h>
  2. #include <math.h>

  3. int main()
  4. {
  5.     double result = 0;

  6.     for(int i=0; i<64; i++){
  7.         result += pow(2, i);
  8.     }

  9.     printf("result = %.0f\n", result);

  10.     return 0;
  11. }
复制代码

最佳答案
2022-1-4 11:09:05
这两个输出都不对
第一个是因为double类型本身的精度误差造成的,这可以理解
要么接受这个误差,要么换用第三方库
你的第二个输出确实奇怪,不知道你是怎么弄出来的

  1. $ cat main.py
  2. #!/usr/bin/env python
  3. #coding=utf-8

  4. result = 0
  5. for i in range(64):
  6.     result += pow(2, i)
  7. print(result)
  8. $ ./main.py
  9. 18446744073709551615
  10. $
  11. $
  12. $ cat main.c
  13. #include <stdio.h>
  14. #include <math.h>

  15. int main()
  16. {
  17.     double result = 0;

  18.     for(int i=0; i<64; i++){
  19.         result += pow(2, i);
  20.     }

  21.     printf("result = %.0f\n", result);

  22.     return 0;
  23. }
  24. $ ./main
  25. result = 18446744073709551616
  26. $
复制代码

gcc

gcc

dev

dev
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-1-4 11:09:05 | 显示全部楼层    本楼为最佳答案   
这两个输出都不对
第一个是因为double类型本身的精度误差造成的,这可以理解
要么接受这个误差,要么换用第三方库
你的第二个输出确实奇怪,不知道你是怎么弄出来的

  1. $ cat main.py
  2. #!/usr/bin/env python
  3. #coding=utf-8

  4. result = 0
  5. for i in range(64):
  6.     result += pow(2, i)
  7. print(result)
  8. $ ./main.py
  9. 18446744073709551615
  10. $
  11. $
  12. $ cat main.c
  13. #include <stdio.h>
  14. #include <math.h>

  15. int main()
  16. {
  17.     double result = 0;

  18.     for(int i=0; i<64; i++){
  19.         result += pow(2, i);
  20.     }

  21.     printf("result = %.0f\n", result);

  22.     return 0;
  23. }
  24. $ ./main
  25. result = 18446744073709551616
  26. $
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-4 11:20:39 | 显示全部楼层
人造人 发表于 2022-1-4 11:09
这两个输出都不对
第一个是因为double类型本身的精度误差造成的,这可以理解
要么接受这个误差,要么换用 ...

就直接编译运行就是这个结果,我也很奇怪
1641266306(1).png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-4 11:38:39 | 显示全部楼层
阿萨德按时 发表于 2022-1-4 11:20
就直接编译运行就是这个结果,我也很奇怪

那就贴一下反汇编代码,我来研究研究
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-4 13:53:00 | 显示全部楼层
人造人 发表于 2022-1-4 11:38
那就贴一下反汇编代码,我来研究研究

我是萌新 是这样搞吗

新建文本文档.txt

255.58 KB, 下载次数: 11

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-4 15:36:14 | 显示全部楼层
试一试下面这些代码
  1. #include <stdio.h>
  2. #include <math.h>

  3. int main()
  4. {
  5.     float result = 0;

  6.     for(int i=0; i<64; i++){
  7.         result += pow(2, i);
  8.     }

  9.     printf("result = %.0f\n", result);

  10.     return 0;
  11. }
复制代码

  1. #include <stdio.h>
  2. #include <math.h>

  3. int main()
  4. {
  5.     double result = 0;

  6.     for(int i=0; i<64; i++){
  7.         result += pow(2, i);
  8.     }

  9.     printf("result = %.0lf\n", result);

  10.     return 0;
  11. }
复制代码

  1. #include <stdio.h>
  2. #include <math.h>

  3. int main()
  4. {
  5.     printf("%lu\n", sizeof(float));
  6.     printf("%lu\n", sizeof(double));
  7.     return 0;
  8. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-4 15:48:47 | 显示全部楼层
人造人 发表于 2022-1-4 15:36
试一试下面这些代码

上面两段还是一样result = 18446744073709552000
最后一段是4和8
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-4 20:07:16 | 显示全部楼层
阿萨德按时 发表于 2022-1-4 15:48
上面两段还是一样result = 18446744073709552000
最后一段是4和8

看看这个输出什么

  1. #include <stdio.h>
  2. #include <math.h>

  3. int main()
  4. {
  5.     double result = 0;

  6.     for(int i=0; i<64; i++){
  7.         result += pow(2, i);
  8.     }

  9.     //printf("result = %.0f\n", result);
  10.     const unsigned char *base = (const unsigned char *)&result;
  11.     for(size_t i = 0; i < 8; ++i) {
  12.         printf("%.2x ", base[i]);
  13.     }
  14.     puts("");

  15.     return 0;
  16. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-5 08:27:03 | 显示全部楼层
人造人 发表于 2022-1-4 20:07
看看这个输出什么

00 00 00 00 00 00 f0 43
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-5 12:32:14 | 显示全部楼层

我这边也输出这个,说明上面的for循环计算出的result是正确的,问题出在printf
看看这个输出什么
  1. #include <stdio.h>
  2. #include <math.h>

  3. int main()
  4. {
  5.     double result = 0;

  6.     for(int i=0; i<64; i++){
  7.         result += pow(2, i);
  8.     }

  9.     //printf("result = %.0f\n", result);
  10.     const unsigned char *base = (const unsigned char *)&result;
  11.     for(size_t i = 0; i < 8; ++i) {
  12.         printf("%.2x ", base[i]);
  13.     }
  14.     puts("");
  15.     printf("result = %f\n", result);
  16.     printf("result = %lf\n", result);
  17.     printf("result = %.23e\n", result);
  18.     printf("result = %.23le\n", result);
  19.     printf("result = %.23E\n", result);
  20.     printf("result = %.23lE\n", result);

  21.     return 0;
  22. }
复制代码


我这边输出这个
  1. 00 00 00 00 00 00 f0 43
  2. result = 18446744073709551616.000000
  3. result = 18446744073709551616.000000
  4. result = 1.84467440737095516160000e+19
  5. result = 1.84467440737095516160000e+19
  6. result = 1.84467440737095516160000E+19
  7. result = 1.84467440737095516160000E+19
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-5 12:36:30 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <math.h>

  3. int main()
  4. {
  5.     double result = 18446744073709551616.0;
  6.     const unsigned char *base = (const unsigned char *)&result;
  7.     for(size_t i = 0; i < 8; ++i) {
  8.         printf("%.2x ", base[i]);
  9.     }
  10.     puts("");
  11.     printf("result = %lf\n", result);
  12.     return 0;
  13. }
复制代码

  1. 00 00 00 00 00 00 f0 43
  2. result = 18446744073709551616.000000
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-5 13:10:34 | 显示全部楼层
人造人 发表于 2022-1-5 12:32
我这边也输出这个,说明上面的for循环计算出的result是正确的,问题出在printf
看看这个输出什么

00 00 00 00 00 00 f0 43
result = 18446744073709552000.000000
result = 18446744073709552000.000000
result = 1.84467440737095520000000e+019
result = 1.84467440737095520000000e+019
result = 1.84467440737095520000000E+019
result = 1.84467440737095520000000E+019
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-5 13:11:40 | 显示全部楼层

00 00 00 00 00 00 f0 43
result = 18446744073709552000.000000
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-5 13:42:31 | 显示全部楼层
阿萨德按时 发表于 2022-1-5 13:11
00 00 00 00 00 00 f0 43
result = 18446744073709552000.000000


问题出在printf,如果仔细看输出结果的话
前面全一样,只有后4位不一样
一个是 1616,一个是 2000
在第一个 6 的位置四舍五入就是 2000
这其实是printf的精度问题,误差有点大对吧
但是这误差其实不大,这么大的数字就差了 384
  1. >>> 18446744073709552000-18446744073709551616
  2. 384
  3. >>> 384/18446744073709551616
  4. 2.0816681711721685e-17
  5. >>> "{:.30f}".format(384/18446744073709551616)
  6. '0.000000000000000020816681711722'
  7. >>>
复制代码


你使用的编译系统可能有点老了,升级一下你的编译系统吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-5 13:52:21 | 显示全部楼层
人造人 发表于 2022-1-5 13:42
问题出在printf,如果仔细看输出结果的话
前面全一样,只有后4位不一样
一个是 1616,一个是 2000

好的  谢谢大佬
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-25 00:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表