那个这不是真的。
因为int可以t代表小数。小数可以用浮点数或双精度数表示。
c语言中,取int()会强制将其他数据类型转换成int,小数点后的位数不会直接四舍五入。
例如:
intb10//将变量声明为int类型,并初始化赋值。
printf(%f,b*5.0);//打印为浮点数,强制10*5.0得到50.000000。
浮动a2.1314//将变量声明为实数,并初始化赋值。
谢谢邀请我。
在c语言程序的开发中,有时浮点运算是不可避免的。遗憾的是,由于计算机的精度有限,c语言程序并不总能准确地存储和处理浮点数,这也是很多c语言程序尽量使用整数运算而不是浮点运算的原因之一。
计算机存储浮点数的不同于存储整数的。当谈到长浮点数时,它可以不能存放在无限的空间里,是吗?事实上,浮点数在计算机中的存储是有一些国际标准的。这个可以参考我之前的文章。
鉴于c语言程序并不总是能准确表示浮点数,我们在编写程序时需要牢记这一特性,否则c语言程序最终可能会产生无法理解的结果。本文将以问答的形式探讨c语言程序开发中浮点运算的基本注意事项。
float变量定义为3.1,为什么printf打印的是3.099999?情况并非总是如此。很多计算机用二进制表示整数,用二进制表示浮点数。我们人类经常用十进制来表示数字。不幸的是,可以用十进制精确表示的数字可能无法用二进制精确表示。
例如,在十进制系统中,分数1/30.33333…无数个3s和小数可以不能准确地表示这个数字。同理,0.1,也就是1/10,可以t无法用二进制(0.0001100110011…)精确表示,所以在这种情况下,3.1可以t无法精确表达,只能用3.0999999来近似。
使用printf()函数打印3.1,最终显示到终端的结果主要取决于使用的计算机中二进制/十进制转换的程度。事实上,有时当我们将一个精确的十进制浮点数转换成二进制数,然后再转换回十进制数时,我们会发现这两个数并不是"平等"。
为什么可以tsqrt(144。)得到正确的结果?
小明想用c语言中数学库的sqrt()函数计算144的平方根,所以写了下面的c语言代码,请看:
但是小明编的这个c语言。说出代码并执行后,发现程序输出是一串杂七杂八的数字。这是怎么回事?
仔细观察小明sc语言代码显示,尽管他调用了数学库中的函数,但他没有包含相应的头文件"math.h",导致c语言编译器无法确定sqrt()函数的原型。此时,编译器不得不"猜测"sqrt()的函数原型为:
也就是编译器认为sqrt()函数的返回值是整数。如果读者读了我之前的文章,应该明白计算机存储整数和浮点数的不同,所以c语言程序通过存储浮点数来解释整数时可能出现意外结果是很自然的。
如果c语言编译器在处理函数时没有找到它的原型,一般会把intf()作为函数的原型。
如何判断两个浮点数是否相等?计算机可以t精确表示浮点数,这也影响c语言程序判断两个浮点数是否相等。如果读者读过我以前的文章,应该很清楚,运营商可以t在c语言程序中用来判断两个浮点数是否相等。
事实上,由于c语言程序不能总是准确地表示浮点数,所以当需要判断两个浮点数是否"平等",通常的做法是判断两个数是否"关闭"够了:
其中epsilon是一个非常小的整数,上面的表达式使得浮点数a和b足够接近,可以近似为"平等"。虽然ε在浮点数表示的范围内应该足够小,但在实际开发中,只要能满足精度的实际需要,"适可而止。"所以ε也可以是程序员自己设定的一个阈值。
如何赋一些特殊值,比如nan(不是数,不是数)?很多平台都提供了方便处理浮点值的工具或函数,比如像isnan()这样的一些预定义的常量和函数。这些工具要么是ltmath.hgt中的标准扩展,要么是ltieee.hgt或ltnan.hgt的非标准扩展。
一般来说,如果一个数不等于自己,那么它一定是楠:
然而,应该注意,c语言编译器可以优化这种比较代码,以便符合ieee。还要注意,即使像nan这样的特殊号码在系统中预定义,我们也可以不要和其他数字比较。例如,if(xnan)是一个不合适的代码,因为nan可以不要和数字相比。
如果开发c语言程序的平台没有像nan那样直接提供特殊数字,我们可以自己定义,比如:
但是,应该明白,有些编译器会把上面两行c语言代码当作"浮点异常",而此时我们将无法获得nan和inf。
对于nan和inf,另外需要明确的是sprintf()函数的格式输出。在某些平台上,它可以生成类似于"南"和"inf"。
小结本节主要介绍c语言程序开发中处理浮点数时应该注意的事项。因为计算机可以不要总是精确地存储浮点数,处理浮点数和处理整数是有区别的。如果你不我不知道这些,它编写有问题的代码很容易。我强烈推荐你在这里阅读我以前的文章。