2 pijianzhirui pijianzhirui 于 2016.05.12 11:05 提问

code::blocks中把10^9定义成double型没有溢出定义成long double型却溢出

code::blocks(GNU GCC Complier)中把10^9定义成double型没有溢出,定义成long double型反倒溢出了。而10^9既没有超过double的范围,更没有超过Long double的范围,这是GNU GCC Complier的bug吗?我的code::blocks是16.01的,已经是最新版了。

#include
#include

double a;
long double b;

int main()

{
a=1E9;
b=a;
printf(" sizeof_Double=%d\n 2^63=%e\n a=%e\n",sizeof(double),pow(2,63),a);
printf(" sizeof_LongDouble=%d\n 2^95=%e\n b=%e\n",sizeof(long double),pow(2,95),b);
return 0;

}
图片说明
图片说明

​关于如何输出b,如果使用%e,%f或%lf,有警告:format '%e'(或者'%f','%lf') expects argument of type 'double', but argument 4 has type 'long double' [-Wformat=].如果使用小写的l,有警告:unknown conversion type character 0xa in format [-Wformat=].too many arguments for format [-Wformat-extra-args].如果使用大写的L,有警告:unknown conversion type character 'L' in format [-Wformat=]. too many arguments for format [-Wformat-extra-args]

我的处理器也是64位的,指令集 x86, x86-64, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2, FMA, AES
图片说明

2个回答

lm_whales
lm_whales   Rxr 2016.05.12 12:01

printf 使用错误而已
long double 有两种输出格式
1)%lf
这种格式 float,用 %hf,double 用 %f输出,long double 用 %lf 输出
2)%Lf
这种格式 float ,double用 %f输出,double 用 %lf(标准中,最初没有,后来补充为可选项),long double 用 %Lf 输出
增经用 code::blocks 的某个版本,就是这样的,具体选项,没记住
不同选项输出方式不同
具体如何组合,记得不很清楚,大约 就是这样吧

%hf,%f,%lf
%f,%Lf
%f,%lf,%Lf
%f,%lf

netgator
netgator   2016.05.15 14:39

If you want to use "%Lf" in printf, add "#define USE_MINGW_ANSI_STDIO 1" before your "#include "

netgator
netgator before your "#include <stdio.h>"
大约 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
关于类型转换、溢出、移位等操作的小总结
类型转换、溢出、移位等操作标签:c/c++类型转换 运算符两边操作数的类型转化 此时,操作数类型的转换规则如下:图中的横向箭头:针对运算符两边是同类型的数据(不同级别的类型当然也适用!)   表示必须的转换(虽然运算符两边的操作数类型相同),如两个float型数参加运算,虽然它们类型相同,但仍要先转成double型再进行运算,结果亦为double型。两个char类型的数据进行相关的操作也是一样(
long long ,double 类型的血的教训
当整个程序中出现double ,long long 类型的时候,你要注意就不要认为所有的变量都是int型的了!!!!!! 如果程序有错误,如果有double ,long long 首先检查是否应该用long long double,写成了int
定义一个有10个元素的double型数组,然后从数组的最后一个元素倒着输出到第0个元素。并将数组元素进行累加。(java:数组和for循环)
double array = new double[]{1.0,2.0,3,4,5,6,7,8,9,10}; int length = array.length; //定义数组长度 for(a=length-1;a&amp;gt;=0;a--){ //既然是倒着输出那么肯定是从大到小 System.out.print(array[a]) //下标比值要小一位 a=10-...
Java中int,float,long,double取值范围,内存泄露
java中所有数字都是带符号的,没有unsigned, int在java中是固定的32bits,表示的范围为-2^31到2^31-1  -2147483648到2147483647才是正确的! 10位 -----------------------------------------------------------------------------------------------
C# double型运算溢出问题
遇到问题: double a = 2; double b = -1.1; a += b; Console.WriteLine(a); 控制应用台输出0.9,但是实际a中为0.89999999999999991 上网搜索了下相关概念,发现double是一个浮点数存在溢出的情况。下面介绍下查到的float,double,decimal三种数据类型的关系和区别 float 和 double类
有关C++的数据类型(int,long,short,float,double等等)
看书的时候总结几个方便以后复习: 1、整形:表示整数、字符和布尔值的算数类型的合称; 2、字符类型有两种:char和wchar_t,char类型通常是单个字节,wchar_t类型用于扩展字符集,比如汉字和日语,这些字符集不能用单个char表示; 3、short、int、long类型都表示整形,一般来说(32位机器),short占16位,两字节;int占32位(根据系统而定,32位机下为4个字
double型10进制转二进制
整数部分:除二取余 Integer.toBinaryString()  小数部分:乘二取整 例子 从键盘输入某个十进制小数,转换成对应的二进制小数并输出。 (查询十进制小数转换成二进制小数的算法,使用循环来实现。最多保留小数位后7位数字即可) /* Scanner sc=new Scanner(System.in); System.out.println("输入一个十进制小数");
使用Double类创建double类型变量
package z10; //定义一个String str = "1234"; //将其转换为double类型并输出 //使用Double类创建double类型变量db并赋值1234 //比较两者是否一致 public class TestString1 { public static void main(String[] args) { // TODO Auto-gener
Java中float、double、long类型变量赋值添加f、d、L尾缀问题
本文介绍了Java中float、double、long赋值需要添加尾缀的原因,并且说明了什么情况下不需要尾缀,但是建议最好都添加尾缀,防止报错和程序可读性。
由一道题引起的思考? java中 long 和double都是64位。为什么double表示的范围大那么多呢?
由一道题引起的思考? java中 long 和double都是64位。为什么double表示的范围大那么多呢?百度标准答案是这样子的:double是n*2^m(n乘以2的m次方)这种形式存储的,只需要记录n和m两个数就行了,m的值影响范围大,所以表示的范围比long大。 但是m越大,n的精度就越小,所以double并不能把它所表示的范围里的所有数都能精确表示出来,而long就可以。 但是我