鱼C论坛

 找回密码
 立即注册
查看: 4583|回复: 18

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

[复制链接]
发表于 2016-12-13 12:09:54 | 显示全部楼层 |阅读模式

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

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

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

然后我的程序如下:
1.png

运行结果如下:
2.png

真没弄明白,关于long double的取值范围……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-12-13 17:00:32 | 显示全部楼层
贴一下代码
不是图片
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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;
}

发现虚拟机的剪贴板的东西出不来,还是自己打了一遍……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-14 02:45:09 | 显示全部楼层
感觉是格式化输出时的问题
改成%Le试试,,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-14 12:32:27 | 显示全部楼层
本帖最后由 zealstar 于 2016-12-14 12:35 编辑
zzzz76 发表于 2016-12-14 02:45
感觉是格式化输出时的问题
改成%Le试试,,


测试过,也是一样的……

但是只要把上面的数据类型改成double就正常了。只是不明白原理……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-14 12:41:09 | 显示全部楼层
zealstar 发表于 2016-12-13 23:52
发现虚拟机的剪贴板的东西出不来,还是自己打了一遍……

另一个
unsigned long long int
这个也要
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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要怎样输出?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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麦子
请按任意键继续. . .
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-14 13:51:44 | 显示全部楼层
人造人 发表于 2016-12-14 13:34
我也不清楚,在Windows下是正确的

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

可能是GCC编译器的问题,我在WINDOWS下用DEV C++的 TMD-GCC 4.9.2 编译也是一样的后果,因为没装其他编译器,暂时不知道还有没有其他可能。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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$
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-14 14:56:46 | 显示全部楼层
不行,codeblock也出错……
VC6.0就根本不能用……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-15 01:14:07 | 显示全部楼层
222.png

是的,我这边有问题,哎……好吧,知道怎么能正确使用long double类型就好,我估计问题还是我的编译器。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-15 11:53:38 | 显示全部楼层
人造人 发表于 2016-12-14 16:31
这段代码不能用吗?
我这边可以呀

估计还是数据类型转换这个编译过程里出了问题……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-15 12:24:21 | 显示全部楼层
zealstar 发表于 2016-12-15 11:53
估计还是数据类型转换这个编译过程里出了问题……

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

使用道具 举报

 楼主| 发表于 2016-12-15 13:00:40 | 显示全部楼层

对,我就是复制的你的代码编译运行的……

应该没错了吧
#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;
}

我这边运行结果就是上面的截图……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-15 13:10:53 | 显示全部楼层
zealstar 发表于 2016-12-15 13:00
对,我就是复制的你的代码编译运行的……

应该没错了吧

我用vs2015,你有条件的话也试试
我在centos 64位下也可以
无标题.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-15 16:04:11 | 显示全部楼层
人造人 发表于 2016-12-15 13:10
我用vs2015,你有条件的话也试试
我在centos 64位下也可以

好的,正在下VC2015,看到VC2015功能实在是太杂了……果然有点高大上
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-27 17:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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