新手问一个关于long double数据取值范围的问题……
甲鱼S1E5的练习中有一个程序,是用来算麦子数量的。因为数值比较大,所以数据类型取的都是unsigned long long int。然后,通过后一个课程的了解,我发现,long double似乎也能表达这么巨大的数值,所以我更换了数据类型,但是结果却……求解……{:10_277:}首先是,数据类型取值范围如下:
然后我的程序如下:
运行结果如下:
真没弄明白,关于long double的取值范围……
{:10_299:} 贴一下代码
不是图片 人造人 发表于 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;
}
发现虚拟机的剪贴板的东西出不来,还是自己打了一遍…… 感觉是格式化输出时的问题
改成%Le试试,, 本帖最后由 zealstar 于 2016-12-14 12:35 编辑
zzzz76 发表于 2016-12-14 02:45
感觉是格式化输出时的问题
改成%Le试试,,
测试过,也是一样的……
但是只要把上面的数据类型改成double就正常了。只是不明白原理…… zealstar 发表于 2016-12-13 23:52
发现虚拟机的剪贴板的东西出不来,还是自己打了一遍……
另一个
unsigned long long int
这个也要 人造人 发表于 2016-12-14 12:41
另一个
unsigned long long int
这个也要
额……甲鱼的标准答案就是数据类型用unsigned long long int,然后输出格式用%llu,这个可以得到正确结果
但是,如果使用的是其他类型呢?
我测试了double类型,输出格式用%e,也是正确的。
但是换成long double,输出格式依然用%e,就出错。%le和%lle也出错。所以我有点不知所措了。
如果使用long double要怎样输出? zealstar 发表于 2016-12-14 13:03
额……甲鱼的标准答案就是数据类型用unsigned long long int,然后输出格式用%llu,这个可以得到正确结 ...
我也不清楚,在Windows下是正确的
舍罕王应该给予达依尔1.844674e+19粒麦子
如果每25000粒麦子为1kg,那么应该给7.378698e+14kg麦子
请按任意键继续. . .
舍罕王应该给予达依尔18446744073709551615粒麦子
如果每25000粒麦子为1kg,那么应该给737869762948382kg麦子
请按任意键继续. . . 人造人 发表于 2016-12-14 13:34
我也不清楚,在Windows下是正确的
舍罕王应该给予达依尔1.844674e+19粒麦子
可能是GCC编译器的问题,我在WINDOWS下用DEV C++的 TMD-GCC 4.9.2 编译也是一样的后果,因为没装其他编译器,暂时不知道还有没有其他可能。 用%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$
人造人 发表于 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试试 不行,codeblock也出错……{:10_266:}
VC6.0就根本不能用…… 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;
}
是的,我这边有问题,哎……好吧,知道怎么能正确使用long double类型就好,我估计问题还是我的编译器。 人造人 发表于 2016-12-14 16:31
这段代码不能用吗?
我这边可以呀
估计还是数据类型转换这个编译过程里出了问题…… zealstar 发表于 2016-12-15 11:53
估计还是数据类型转换这个编译过程里出了问题……
人造人 发表于 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;
}
我这边运行结果就是上面的截图…… zealstar 发表于 2016-12-15 13:00
对,我就是复制的你的代码编译运行的……
应该没错了吧
我用vs2015,你有条件的话也试试
我在centos 64位下也可以
人造人 发表于 2016-12-15 13:10
我用vs2015,你有条件的话也试试
我在centos 64位下也可以
好的,正在下VC2015,看到VC2015功能实在是太杂了……果然有点高大上{:10_285:}
页:
[1]