当前位置:首页 » 编程语言 » C语言double的输入

C语言double的输入

发布时间: 2022-06-14 06:11:17

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对应的%lf是什么

c语言是%if对应double,%f对应float。

scanf():“%lf”用于double类型,“%f”用于float类型printf():“%f”既可用于double类型,也可用于float类型,意思是指“保留6位小数”。

%f和%lf分别是float类型和double类型用于格式化输入输出时对应的格式符号。

double使用注意事项:

转换的基本规则是“按数据长度增加的方向进行转换”,以保证精度不降低。比如int型数据和long型数据进行相加或相减运算时,系统会先将int型数据转换成long型,然后再进行运算。这样的话运算结果的精度就不会降低。

在运算时,程序中所有的float型数据全部都会先转换成double型。即使只有一个float型数据,也会先转换成double型,然后再进行运算。为什么要这样呢?因为CPU在运算的时候有“字节对齐”的要求,这样运算的速度是最快的。

Ⅲ C语言输入使用double型时,输出总是出错

C语言中scanf输入一般是不控制精度的,只有printf输出才会控制精度
一般输入输出的占位符浮点型(float)用“%f”,双精度型(double)用“%lf”
!注意double的“%lf”中的“l”是字母“L”的小写,不是数字“1”!
“%1f”“%2f”“%.2f”之类的在输入中是不规范的语法,一般只在输出中使用,表示取几位有效数字

Ⅳ double在c语言中的意思是什么

double在这里是指将变量i和变量s定义为双精度实型变量。也就是说:赋给这两个变量的值将以双精度实型格式存储在内存中。

注意事项

1、类型说明符和表达式都必须加括号(单个变量可以不加括号),如把(int)(x+y)写成(int)x+y则成了把x转换成int型之后再与y相加了。

2、无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。

数据类型

double(双精度浮点型)是计算机使用的一种资料型别。比起单精度浮点数(float),double(双精度浮点数)使用 64 位(8字节) 来储存一个浮点数。 它可以表示十进制的15或16位有效数字,负值取值范围为 -1.7976E+308到 -4.94065645841246544E-324,正值取值范围为 4.94065645841246544E-324到 1.797693E+308

以上内容参考:网络-double

Ⅳ C语言输入一个double类型数据,要求将该数保留一位小数,第二位进行四舍五入,并将结果输出

在C语言中输入一个double类型数据,将该数保留一位小数,第二位进行四舍五入,并将结果输出,这是很容易实现的,因为它自带的格式输出函数printf就可以轻松实现这一功能的:
double x;
scanf("%lf",&x);
printf("%.2f\n",x);

Ⅵ C语言中如何 判断输入是否为double

你给变量定义成double类型的,然后在给它赋值的时候,用scanf("%lf",&a);
比方你定义的变量是a
那么你输入的就是double的

Ⅶ C语言中关于double型数据的输入

这是一个初学者经常犯的一个错误,应该用%lf,因为double和float在内存分配上存在差异,所以用scanf函数进行输入的时候要加以区别。

Ⅷ C语言 双精度类型(double)变量的输入问题

c语言中
单精度型和双精度型
指两种
类型

浮点数。
单精度型

float
型,
有效数字约10进制7位
双精度型

double
型,
有效数字约10进制15位
所以能描述的数值精度不同。
c语言
数据

ieee
754
国际标准。float


4
字节存放,double


8
字节存放。
single
precision
2进制:
数符1位,指数8
位,尾数
23

double
precision
2进制:
数符1位,指数11
位,尾数
52

单精数值范围:
±
~10的-44.85次方


10的38.53次方
双精度数值范围
±
~10的-323.3
次方
to

10的
308.3次方。
float
a=1.234567;
double
b=1.2345678901234;
-------------
10%3
整除取余数,得
1。
1

float

double
表示,精度没有区别。
a=(float)(10%3);
b=(double)(10%3);
强制转换
要带
小括号。

Ⅸ C语言中的double是最多多少位

双精度实数,占用字节8。

有效数字15~16(因为二进制转十进制问题)。

数值范围-1.7*10负308次方~1.7*10的308次方。

当有效数字全部是整数时,即整数有15~16位。

C语言中,输出double类型(双精度实型)以及float类型(单精度实型)时,默认输出6位小数(不足六位以 0 补齐,超过六位按四舍五入截断)。double a = 1;printf("%lf ", a);输出会是:1.000000

比如计算平均分,一到两位小数就足够了。可是有时六位又不够,需要更多位小数,比如计算高精度平方根。这时可以用printf的格式控制。如果要输出n位小数,那么可以用%.nlf的格式。其中n为数字。

所在函数库为【ctype.h】

int isalpha(int ch) 若ch是字母('A'-'Z','a'-'z')返回非0值,否则返回0

int isalnum(int ch) 若ch是字母('A'-'Z','a'-'z')或数字('0'-'9')

返回非0值,否则返回0

intisascii(int ch) 若ch是字符(ASCII码中的0-127)返回非0值,否则返回0

intiscntrl(int ch) 若ch是作废字符(0x7F)或普通控制字符(0x00-0x1F)

以上内容参考:网络-C语言函数

Ⅹ C语言中double有什么用处

c语言中double的用法如下:double、float都是浮点型。double(双精度型)比float(单精度型)存的数据更准确些,占的空间也更大。double精度是float的两倍,所以需要更精确的计算常使用double。单精度浮点数在机内占4个字节,用32位二进制描述。双精度浮点数在机内占8个字节,用64位二进制描述。浮点数在机内用指数型式表示,分解为:数符,尾数,指数符,指数四部分。数符占1位二进制,表示数的正负。指数符占1位二进制,表示指数的正负。尾数表示浮点数有效数字,0.xxxxxxx,但不存开头的0和点指数存指数的有效数字。指数占多少位,尾数占多少位,由计算机系统决定。可能是数符加尾数占24位,指数符加指数占8位 -- float.数符加尾数占48位,指数符加指数占16位 -- double.知道了这四部分的占位,按二进制估计大小范围,再换算为十进制,就是你想知道的数值范围。对编程人员来说,double 和 float 的区别是double精度高,有效数字16位,float精度7位。但double消耗内存是float的两倍,double的运算速度比float慢得多,C语言中数学函数名称double 和 float不同,不要写错,能用单精度时不要用双精度(以省内存,加快运算速度)。

热点内容
删除sqlserver服务 发布:2024-05-18 16:47:06 浏览:323
密码盒的密码是多少钱 发布:2024-05-18 16:43:52 浏览:95
linux哪个c语言编译器好用 发布:2024-05-18 16:30:03 浏览:469
搜狐视频无法缓存 发布:2024-05-18 16:30:03 浏览:310
小鸟云服务器值不值得买 发布:2024-05-18 16:30:01 浏览:899
durbin算法 发布:2024-05-18 16:29:57 浏览:556
qq邮箱访问受限 发布:2024-05-18 16:23:27 浏览:473
电信光纤上传限制 发布:2024-05-18 16:08:05 浏览:911
sql中的limit 发布:2024-05-18 16:05:57 浏览:896
启动ug时服务器无响应是怎么回事 发布:2024-05-18 15:48:24 浏览:372