zealstar 发表于 2016-12-13 12:09:54

新手问一个关于long double数据取值范围的问题……

甲鱼S1E5的练习中有一个程序,是用来算麦子数量的。因为数值比较大,所以数据类型取的都是unsigned long long int。然后,通过后一个课程的了解,我发现,long double似乎也能表达这么巨大的数值,所以我更换了数据类型,但是结果却……求解……{:10_277:}
首先是,数据类型取值范围如下:


然后我的程序如下:


运行结果如下:


真没弄明白,关于long double的取值范围……
{:10_299:}

人造人 发表于 2016-12-13 17:00:32

贴一下代码
不是图片

zealstar 发表于 2016-12-13 23:52:29

人造人 发表于 2016-12-13 17:00
贴一下代码
不是图片

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

int main()
{
        long double temp;
        long double sum=0;
        long double weight;
        int i;
       
        for(i=0; i<64; i++)
        {
                temp=pow(2,i);
                sum=sum+temp;
        }
       
        weight=sum/25000;
        printf("舍罕王应该给予达依尔%e粒麦子\n", sum);
        printf("如果每25000粒麦子为1kg,那么应该给%ekg麦子\n", weight);
       
        return 0;
}


发现虚拟机的剪贴板的东西出不来,还是自己打了一遍……

zzzz76 发表于 2016-12-14 02:45:09

感觉是格式化输出时的问题
改成%Le试试,,

zealstar 发表于 2016-12-14 12:32:27

本帖最后由 zealstar 于 2016-12-14 12:35 编辑

zzzz76 发表于 2016-12-14 02:45
感觉是格式化输出时的问题
改成%Le试试,,

测试过,也是一样的……

但是只要把上面的数据类型改成double就正常了。只是不明白原理……

人造人 发表于 2016-12-14 12:41:09

zealstar 发表于 2016-12-13 23:52
发现虚拟机的剪贴板的东西出不来,还是自己打了一遍……

另一个
unsigned long long int
这个也要

zealstar 发表于 2016-12-14 13:03:26

人造人 发表于 2016-12-14 12:41
另一个
unsigned long long int
这个也要

额……甲鱼的标准答案就是数据类型用unsigned long long int,然后输出格式用%llu,这个可以得到正确结果
但是,如果使用的是其他类型呢?

我测试了double类型,输出格式用%e,也是正确的。

但是换成long double,输出格式依然用%e,就出错。%le和%lle也出错。所以我有点不知所措了。
如果使用long double要怎样输出?

人造人 发表于 2016-12-14 13:34:05

zealstar 发表于 2016-12-14 13:03
额……甲鱼的标准答案就是数据类型用unsigned long long int,然后输出格式用%llu,这个可以得到正确结 ...

我也不清楚,在Windows下是正确的

舍罕王应该给予达依尔1.844674e+19粒麦子
如果每25000粒麦子为1kg,那么应该给7.378698e+14kg麦子
请按任意键继续. . .

舍罕王应该给予达依尔18446744073709551615粒麦子
如果每25000粒麦子为1kg,那么应该给737869762948382kg麦子
请按任意键继续. . .

zealstar 发表于 2016-12-14 13:51:44

人造人 发表于 2016-12-14 13:34
我也不清楚,在Windows下是正确的

舍罕王应该给予达依尔1.844674e+19粒麦子


可能是GCC编译器的问题,我在WINDOWS下用DEV C++的 TMD-GCC 4.9.2 编译也是一样的后果,因为没装其他编译器,暂时不知道还有没有其他可能。

人造人 发表于 2016-12-14 13:52:20

用%llf输出

sh-4.1$ cat test.c
#include <stdio.h>
#include <math.h>

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

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

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

        return 0;
}

sh-4.1$ gcc test.c -lm && ./a.out
舍罕王应该给予达依尔18446744073709551615.000000粒麦子
如果每25000粒麦子为1kg,那么应该给737869762948382.064575kg麦子
sh-4.1$

zealstar 发表于 2016-12-14 14:50:00

人造人 发表于 2016-12-14 13:52
用%llf输出

sh-4.1$ cat test.c


DEV C++ 5.11编译器TMD-GCC 4.9.2

使用%llf依然是错误的……

等会,我装个vc6.0和codeblock试试

zealstar 发表于 2016-12-14 14:56:46

不行,codeblock也出错……{:10_266:}
VC6.0就根本不能用……

人造人 发表于 2016-12-14 16:31:27

zealstar 发表于 2016-12-14 14:50
DEV C++ 5.11编译器TMD-GCC 4.9.2

使用%llf依然是错误的……


这段代码不能用吗?
我这边可以呀
#include <stdio.h>
#include <math.h>

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

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

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

        return 0;
}

zealstar 发表于 2016-12-15 01:14:07



是的,我这边有问题,哎……好吧,知道怎么能正确使用long double类型就好,我估计问题还是我的编译器。

zealstar 发表于 2016-12-15 11:53:38

人造人 发表于 2016-12-14 16:31
这段代码不能用吗?
我这边可以呀

估计还是数据类型转换这个编译过程里出了问题……

人造人 发表于 2016-12-15 12:24:21

zealstar 发表于 2016-12-15 11:53
估计还是数据类型转换这个编译过程里出了问题……

zealstar 发表于 2016-12-15 13:00:40

人造人 发表于 2016-12-15 12:24


对,我就是复制的你的代码编译运行的……{:10_277:}

应该没错了吧

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

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

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

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

      return 0;
}


我这边运行结果就是上面的截图……

人造人 发表于 2016-12-15 13:10:53

zealstar 发表于 2016-12-15 13:00
对,我就是复制的你的代码编译运行的……

应该没错了吧


我用vs2015,你有条件的话也试试
我在centos 64位下也可以

zealstar 发表于 2016-12-15 16:04:11

人造人 发表于 2016-12-15 13:10
我用vs2015,你有条件的话也试试
我在centos 64位下也可以

好的,正在下VC2015,看到VC2015功能实在是太杂了……果然有点高大上{:10_285:}
页: [1]
查看完整版本: 新手问一个关于long double数据取值范围的问题……