- 论坛徽章:
- 145
|
本帖最后由 jason680 于 2017-03-01 21:57 编辑
回复 1# haofang666777
>> 浮点数...精度不准
1.本来就不淮
2. IEEE 754问题
$ echo 0.3 0.3 0.4 | awk '{if($1+$2+$3==1)print "yes";else print "no"}'
yes
$ echo 0.3 0.3 0.3 0.1 | awk '{if($1+$2+$3+$4==1)print "yes";else print "no"}'
no
$ echo 0.3 0.3 0.3 0.1 | awk '{a=$1+$2+$3+$4;if(a==1)print "yes";else print "no";printf("%%d =%d\n%%f =%f\n%%.f =%.f\n%%.20f=%.20f\n",a,a,a,a)}'
no
%d =0
%f =1.000000
%.f =1
%.20f=0.99999999999999988898
$ seq 9 | awk 'function x(n){a=1-n/10;b=1/10*(10-n);printf("a=%.20f\nb=%.20f %s\n",a,b,(a==b)?"a==b":"a!=b ***")}{x($1)}'
a=0.90000000000000002220
b=0.90000000000000002220 a==b
a=0.80000000000000004441
b=0.80000000000000004441 a==b
a=0.69999999999999995559
b=0.70000000000000006661 a!=b ***
a=0.59999999999999997780
b=0.60000000000000008882 a!=b ***
a=0.50000000000000000000
b=0.50000000000000000000 a==b
a=0.40000000000000002220
b=0.40000000000000002220 a==b
a=0.30000000000000004441
b=0.30000000000000004441 a==b
a=0.19999999999999995559
b=0.20000000000000001110 a!=b ***
a=0.09999999999999997780
b=0.10000000000000000555 a!=b ***
IEEE二进制浮点数算术标准(IEEE 754)是20世纪80年代以来最广泛使用的浮点数运算标准,为许多CPU与浮点运算器所采用。这个标准定义了表示浮点数的格式(包括负零-0)与反常值(denormal number)),一些特殊数值(无穷(Inf)与非数值(NaN)),以及这些数值的“浮点数运算符”;它也指明了四种数值舍入规则和五种例外状况(包括例外发生的时机与处理方式)。
IEEE 754规定了四种表示浮点数值的方式:单精确度(32位)、双精确度(64位)、延伸单精确度(43比特以上,很少使用)与延伸双精确度(79比特以上,通常以80位实现)。只有32位模式有强制要求,其他都是选择性的。大部分编程语言都有提供IEEE浮点数格式与算术,但有些将其列为非必需的。例如,IEEE 754问世之前就有的C语言,现在有包括IEEE算术,但不算作强制要求(C语言的float通常是指IEEE单精确度,而double是指双精确度)。
... |
|