Luv啦 2021-08-08 13:49 采纳率: 100%
浏览 42
已结题

这是一个关于C语言数据类型的问题

这里有两份代码,变量的数据类型不同,运行出来的结果不一样,使用double算出来的麦子粒数比int型的要大1,想知道是什么原因造成的,不知道和printf()这个函数有没有关系


```c
#include<stdio.h>
#include<math.h>
int main()
{    
        long double sum = 0;
        long double temp;
        long double weight;
        int i;

        for (i=0; i < 64; i++)
        {
                temp = pow(2, i);
                sum = sum + temp;
        }

        weight = sum / 25000;
        printf("舍罕王应该给予达依尔%.f粒麦子!\n", sum);
        printf("如果每25000粒麦子为1kg,那么应该给%.f公斤麦子!\n", weight);
        return 0;
}

结果如图:

img

```c
#include <stdio.h>
#include <math.h>

int main()
{
        unsigned long long sum = 0;
        unsigned long long temp;
        unsigned long long weight;
        int i;

        for (i=0; i < 64; i++)
        {
                temp = pow(2, i);
                sum = sum + temp;
        }

        weight = sum / 25000;

        printf("舍罕王应该给予达依尔%llu粒麦子!\n", sum);
        printf("如果每25000粒麦子为1kg,那么应该给%llu公斤麦子!\n", weight);

        return 0;
}

结果如图:

img

  • 写回答

1条回答 默认 最新

  • Kilento 2021-08-08 19:57
    关注

    第一个肯定是错的啦,2^0 = 1,结果肯定是奇数。
    主要是精度的问题,long double 保证的有效位数是 18-19,再大就有可能出错了(不代表绝对会出错)。
    另外 long double 使用 %Lf 打印(和编译器有关)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 8月16日
  • 已采纳回答 8月8日
  • 创建了问题 8月8日

悬赏问题

  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作