C++ 一个新手问题, - -

来源:百度知道 编辑:UC知道 时间:2024/06/05 01:34:08
#include <stdio.h>
main()
{
float var;

printf("Please enter a number and then press Enter:");
scanf("%f",&var);

printf("The number you entered was %f\n",var);
}

输入 31.1 时 可得 31.100000,,,,
但是.输入 32.1 时 却得 31.099998,,,,
WHY ???

你需要使用double这样的双精度浮点数。
double var=0.0;

printf("Please enter a number and then press Enter:");
scanf("%lf",&var);

printf("The number you entered was %lf\n",var);
或者把原来的代码
printf("The number you entered was %f\n",var);
规定一下精度
printf("The number you entered was %4.1f\n",var);
试试看。

这个与硬件相关了好像,运算都不是那么太精确,总要舍掉几位,但它又很精确,小数点后那么多位了
想要精确的运算就要有精确的算法

浮点数的表示不像整数那么精确的,所以你用浮点做逻辑运算的时候要注意,不要用==,要用<=,>=这种符号。
在IEEE754标准中,规定,float的32位这样分:

符号位(S) 阶码(E) 尾数(M)
1 8 23
这里应该注意三点:
一,阶码是用移码表示的,这里会有一个127的偏移量,它的127相当于0,小于127时为负,大于127时为正,比如:10000001表示指数为129-127=2,表示真值为2^2,而01111110则表示2^(-1).

二, 尾数全都是小数点后面的数,

三, 但尾数中省略了一个1,因此尾数全为0时,也是1.0...00;

正常 要完全精确是不可能的
不过你用double药精确些 但还是不能完全精确

只有通过一个精确位点 才能近似的做到精确