随笔,C语言 | 每日基础(81)

读者:一个float变量赋值为3.1时, 为什么printf输出的值为3.0999999?

阿一:大多数电脑都是用二进制来表示浮点和整数的。在十进制里, 0.1 是个简单、 精确的小数, 但是用二进制表示起来却是个循环小数 0.0001100110011 …。所以 3.1 在十进制内可以准确地表达, 而在二进制下不能。在对一些二进制中无法精确表示的小数进行赋值或读入再输出时, 也就是从 十进制转成二进制再转回十进制, 你会观察到数值的不一致. 这是由于编译器二进 制/十进制转换例程的精确度引起的, 这些例程也用在 printf 中。

读者:为什么执行一些开方根运算, 可是得到一些意想不到的数字?

阿一:确定你用了 #include <math.h>, 以及正确说明了其它相关函数返回值为 double。另外一个需要注意的库函数是 atof(), 其原型说明在 <stdlib.h> 中。

读者:为什么我做一些简单的三角函数运算, 也引用了 #include <math.h>, 可是一直得到编译错误 “undefined: sin” ?

阿一:确定你真的连接了数学函数库 (math library)。例如, 在 Unix 或Linux 系统 中, 有一个存在了很久的bug, 你需要把参数 -lm 加在编译或连接命令行的最后。

正文完