鱼C论坛

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

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

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

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

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

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

int main()
{
    double result = 0;

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

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

    return 0;
}
最佳答案
2022-1-4 11:09:05
这两个输出都不对
第一个是因为double类型本身的精度误差造成的,这可以理解
要么接受这个误差,要么换用第三方库
你的第二个输出确实奇怪,不知道你是怎么弄出来的
$ cat main.py
#!/usr/bin/env python
#coding=utf-8

result = 0
for i in range(64):
    result += pow(2, i)
print(result)
$ ./main.py
18446744073709551615
$
$
$ cat main.c
#include <stdio.h>
#include <math.h>

int main()
{
    double result = 0;

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

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

    return 0;
}
$ ./main
result = 18446744073709551616
$

gcc

gcc

dev

dev
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

result = 0
for i in range(64):
    result += pow(2, i)
print(result)
$ ./main.py
18446744073709551615
$
$
$ cat main.c
#include <stdio.h>
#include <math.h>

int main()
{
    double result = 0;

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

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

    return 0;
}
$ ./main
result = 18446744073709551616
$
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

就直接编译运行就是这个结果,我也很奇怪
1641266306(1).png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

那就贴一下反汇编代码,我来研究研究
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我是萌新 是这样搞吗

新建文本文档.txt

255.58 KB, 下载次数: 11

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

int main()
{
    float result = 0;

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

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

    return 0;
}
#include <stdio.h>
#include <math.h>

int main()
{
    double result = 0;

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

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

    return 0;
}
#include <stdio.h>
#include <math.h>

int main()
{
    printf("%lu\n", sizeof(float));
    printf("%lu\n", sizeof(double));
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

上面两段还是一样result = 18446744073709552000
最后一段是4和8
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

看看这个输出什么
#include <stdio.h>
#include <math.h>

int main()
{
    double result = 0;

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

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

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

00 00 00 00 00 00 f0 43
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

int main()
{
    double result = 0;

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

    //printf("result = %.0f\n", result);
    const unsigned char *base = (const unsigned char *)&result;
    for(size_t i = 0; i < 8; ++i) {
        printf("%.2x ", base[i]);
    }
    puts("");
    printf("result = %f\n", result);
    printf("result = %lf\n", result);
    printf("result = %.23e\n", result);
    printf("result = %.23le\n", result);
    printf("result = %.23E\n", result);
    printf("result = %.23lE\n", result);

    return 0;
}

我这边输出这个
00 00 00 00 00 00 f0 43
result = 18446744073709551616.000000
result = 18446744073709551616.000000
result = 1.84467440737095516160000e+19
result = 1.84467440737095516160000e+19
result = 1.84467440737095516160000E+19
result = 1.84467440737095516160000E+19
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

int main()
{
    double result = 18446744073709551616.0;
    const unsigned char *base = (const unsigned char *)&result;
    for(size_t i = 0; i < 8; ++i) {
        printf("%.2x ", base[i]);
    }
    puts("");
    printf("result = %lf\n", result);
    return 0;
}
00 00 00 00 00 00 f0 43
result = 18446744073709551616.000000
想知道小甲鱼最近在做啥?请访问 -> 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

00 00 00 00 00 00 f0 43
result = 18446744073709552000.000000
想知道小甲鱼最近在做啥?请访问 -> 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
>>> 18446744073709552000-18446744073709551616
384
>>> 384/18446744073709551616
2.0816681711721685e-17
>>> "{:.30f}".format(384/18446744073709551616)
'0.000000000000000020816681711722'
>>>

你使用的编译系统可能有点老了,升级一下你的编译系统吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

好的  谢谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-7-2 00:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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