c语言中double的用法举例(C语言中double的用法)

本文目录
C语言中double的用法
#include《stdio.h》
int main()
{
double a,b;
scanf("%lf%lf",&a,&b);
a+=b;
printf("%.4f\n",a);
return 0;
}
C语言,是一种通用的、过程式的编程语言,广泛用于系统与应用软件的开发。具有高效、灵活、功能丰富、表达力强和较高的移植性等特点,在程序员中备受青睐。最近25年是使用最为广泛的编程语言。
C语言是由UNIX的研制者丹尼斯·里奇(Dennis Ritchie)于1970年 由 肯·汤普逊(Ken Thompson)所研制出的B语言的基础上发展和完善起来的。目前,C语言编译器普遍存在于各种不同的操作系统中,例如UNIX、MS-DOS、Microsoft Windows及Linux等。C语言的设计影响了许多后来的编程语言,例如C++、Objective-C、Java、C#等。
c语言double和float用法
数据类型。double为最优先级,两者输出的数据后面带六位小数。没有什么用法可言,如果真要说用法就是,给你举个例。double
shu_qinghua;/*定义shu_qinghua(变量)为double*/shu_qinghua=50;/*给它赋值为50*/printf("%f\n",shu_qinghua);/*输出的结果为50.000000因为定义的为double,保留六位小数*/望采纳^-^
c语言中double的用法有哪些
double是一种数据类型 具有比float更高的精度 在32位机中以8个字节储存。用法:同int float 一样,用于声明变量或定义函数的返回值类型,或可用于类型强制转换。
函数(function)的定义通常分为传统定义和近代定义,函数的两个定义本质是相同的,只是叙述概念的出发点不同,传统定义是从运动变化的观点出发,而近代定义是从集合、映射的观点出发。
函数的近代定义是给定一个数集A,假设其中的元素为x,对A中的元素x施加对应法则f,记作f(x),得到另一数集B,假设B中的元素为y,则y与x之间的等量关系可以用y=f(x)表示,函数概念含有三个要素:定义域A、值域B和对应法则f。
函数的由来
中文数学书上使用的“函数”一词是转译词。是我国清代数学家李善兰在翻译《代数学》(1859年)一书时,把“function”译成“函数”的。
中国古代“函”字与“含”字通用,都有着“包含”的意思。李善兰给出的定义是:“凡式中含天,为天之函数。”中国古代用天、地、人、物4个字来表示4个不同的未知数或变量。这个定义的含义是:“凡是公式中含有变量x,则该式子叫做x的函数。”
double在c语言中的意思是什么
double是C语言的一个关键字,代表双精度浮点型,占8个字节内存空间,其数值范围为“1.7E-308~1.7E+308”,双精度完全保证的有效数字是15位,16位只是部分数值有保证。
C语言中,float和double都属于浮点数。区别在于:double所表示的范围,整数部分范围大于float,小数部分,精度也高于float。
举个例子:圆周率3.1415926535 这个数字,如果用float来表示,最多只能精确到小数点后面的6位。而double大约能精确到小数点后面的15位左右。具体精确到几位,跟所用的编译器有关,但是各个器编译器之间,也是相差不大的。
至于整数部分,float表示的整数部分的范围,就已经够大了,能表示到万亿级别,已经大到没边了。而double所表示的整数范围,大到更没边了。实际开发中,除了个别高精领域,基本上,使用float就足够了。
C语言中double类型怎么使用
使用printf时,它们具有相同的格式说明符,但使用scanf时,它们没有相同的格式说明符。
为什么是这样?因为printf的参数被提升,而scanf的参数(作为指针)却不被提升。
这种论点提升到底是什么?当较小尺寸的参数(特别是char,short和float)传递给可变参数函数(如printf之类的函数,其参数数量不固定)时,它们将转换为较大尺寸。Char和short转换为int,float转换为double。
为什么这样 据我所知,纯粹出于历史原因。C的设计师认为这是个好主意,因为这些转换基本上是免费的,因为所有类型的尺寸都足够小,可以放入单个寄存器或堆栈中的单个“单元”(将内容压入堆栈必须与某些字节边界对齐,例如,堆栈上的每个项目都必须以4的倍数的地址开头。同样,显然,这种转换减少了传递参数时的错误。
因此,当您向printf传递float类型的参数时,实际上它会在转换为printf之前就转换为double类型。我们可以使用调试器证明这一点。我写了下面的C代码:
主要功能编译成:
领取关于C/C++更多学习资料:
我在调用printf之前(在地址0x63b处)放了一个断点。根据Linux x86_64调用约定,浮点参数在XMM寄存器中传递(CPU中特殊的小内存位置,可用于对多条数据并行执行同一条指令,但实际上可用于大多数事情) 。因此,我查看了第一个XMM寄存器xmm0,然后:
xmm0中的值之一,当解释为双精度值时,是1,恰好是我们传递给printf的值。同时,当将该寄存器中的值解释为浮点数时,它们是这样(巧合的是,我们得到1.875)。因此,转换确实发生了。这就解释了为什么对于printf,我们在浮点数和双精度参数中都使用%f -浮点数无论如何都会转换为双精度,因此printf不能分辨出两者之间的区别。
同时,scanf的参数是指针,因此不受此转换的限制。其原因是因为所有指针类型仅包含内存地址,并且所有内存地址都具有相同的大小(在我的64位计算机上为64位)。因此,当scanf在其格式字符串中获得%f时,它将期望一个float *类型的指针,而当它获得%lf时,将期望得到double *类型的指针。如果格式说明符和指针的类型不匹配,则会产生一些有趣的结果。
由于float的大小为4个字节,而double的大小为8个字节(至少在我的机器上),因此当我们写入float *类型的指针所指向的位置时,我们将覆盖4个字节的内存。同时,如果我们写入由双*指向的位置,则将覆盖8个字节的内存。考虑以下代码:
printf说明符上的.15标志只是使printf精确度更高。由于我们使用的是双精度值(并且正如我刚刚说的那样,%f也适用于printf的双精度值),因此我们实际上可以访问具有这种精度的数字(只要它们不是太大而不能填充即可。我实际上不是对浮点表示非常了解)
编译并运行后,结果如下:
如您所见,如果我们忽略所有类型的fuckery,则数字应该匹配,但它们甚至不相近。这是为什么?
好吧,我们给scanf%f说明符,所以它期望一个浮点数*。但是我们传递了一个双*。现在,这些指针的实际值都只是地址-scanf不知道它们之间的区别。它进行了下去,读取我们输入的值,并将其存储为float 。但是浮点数仅占用4个字节,因此scanf只会在我们可用的double变量的8个字节中写入4个字节。在我的情况下,由于我的机器是低位字节序的,因此似乎对应于double变量的细粒度(小有效位)数字的第4个字节将被覆盖。因此,当我们打印出double double back时,我们得到的数字几乎与以前相同,但最低有效数字有所变化。
有想学习更多C/C++知识的,可以点击下方了解更多,领取免费学习资料:

更多文章:
c语言中double的用法举例(C语言中double的用法)
2026年10月20日 02:50
sqlite手机版下载安装最新(别人捡到手机怎么删除微信好友)
2026年10月20日 00:40
ps切图尺寸变小(用ps一张图片上裁剪后拖动到另一张图片上为什么变得很小)
2026年10月19日 22:10
matlab源码网站(求一份基于matlab的TSP问题源代码)
2026年10月19日 21:00
page对象的常用属性(getPageSize()中对象的属性是怎么回事)
2026年10月19日 13:40





