|
Packit Service |
f629e6 |
function abs(x) {
|
|
Packit Service |
f629e6 |
return (x+0 >= 0) ? x : -x
|
|
Packit Service |
f629e6 |
}
|
|
Packit Service |
f629e6 |
|
|
Packit Service |
f629e6 |
function check(x,what, f,res) {
|
|
Packit Service |
f629e6 |
for (f in formats) {
|
|
Packit Service |
f629e6 |
res = sprintf(f,x)
|
|
Packit Service |
f629e6 |
if (formats[f] == "non-decimal") {
|
|
Packit Service |
f629e6 |
if ((x >= 0) && (res !~ /e+/)) {
|
|
Packit Service |
f629e6 |
if (abs(strtonum(res)-x) > 1e-5*abs(x))
|
|
Packit Service |
f629e6 |
printf "(sprintf(%s,%s) = %s)-%g = %g\n",
|
|
Packit Service |
f629e6 |
f,what,res,x,strtonum(res)-x
|
|
Packit Service |
f629e6 |
}
|
|
Packit Service |
f629e6 |
}
|
|
Packit Service |
f629e6 |
else if (abs(res-x) > 1e-5*abs(x))
|
|
Packit Service |
f629e6 |
printf "(sprintf(%s,%s) = %s)-%g = %g\n",
|
|
Packit Service |
f629e6 |
f,what,res,x,res-x
|
|
Packit Service |
f629e6 |
}
|
|
Packit Service |
f629e6 |
}
|
|
Packit Service |
f629e6 |
|
|
Packit Service |
f629e6 |
function check_cons(fmt,base,rot,mexp, i,j,dig,res,s) {
|
|
Packit Service |
f629e6 |
# first off, check that zero formats properly
|
|
Packit Service |
f629e6 |
if ((s = sprintf(fmt,0)) != "0")
|
|
Packit Service |
f629e6 |
printf "(sprintf(%s,0) = %s) != 0\n",fmt,s
|
|
Packit Service |
f629e6 |
|
|
Packit Service |
f629e6 |
res = "1"
|
|
Packit Service |
f629e6 |
dig = 1
|
|
Packit Service |
f629e6 |
j = 0
|
|
Packit Service |
f629e6 |
for (i = 0; i <= mexp; i++) {
|
|
Packit Service |
f629e6 |
s = sprintf(fmt,base^i)
|
|
Packit Service |
f629e6 |
if (s ~ /e+/)
|
|
Packit Service |
f629e6 |
return
|
|
Packit Service |
f629e6 |
if (s != res)
|
|
Packit Service |
f629e6 |
printf "(sprintf(%s,%d^%d) = %s) != %s\n",
|
|
Packit Service |
f629e6 |
fmt,base,i,s,res
|
|
Packit Service |
f629e6 |
if (++j == rot) {
|
|
Packit Service |
f629e6 |
dig = 1
|
|
Packit Service |
f629e6 |
res = ("10"substr(res,2))
|
|
Packit Service |
f629e6 |
j = 0
|
|
Packit Service |
f629e6 |
}
|
|
Packit Service |
f629e6 |
else {
|
|
Packit Service |
f629e6 |
dig *= 2
|
|
Packit Service |
f629e6 |
res = (dig substr(res,2))
|
|
Packit Service |
f629e6 |
}
|
|
Packit Service |
f629e6 |
}
|
|
Packit Service |
f629e6 |
}
|
|
Packit Service |
f629e6 |
|
|
Packit Service |
f629e6 |
BEGIN {
|
|
Packit Service |
f629e6 |
# this doesn't necessarily have to be exact since we're checking
|
|
Packit Service |
f629e6 |
# magnitude rather than precision
|
|
Packit Service |
f629e6 |
if (!HUGEVAL) HUGEVAL = 1.7976931348623157e+308
|
|
Packit Service |
f629e6 |
|
|
Packit Service |
f629e6 |
formats["%s"] = ""
|
|
Packit Service |
f629e6 |
formats["%d"] = ""
|
|
Packit Service |
f629e6 |
formats["%.0f"] = ""
|
|
Packit Service |
f629e6 |
formats["0%o"] = "non-decimal"
|
|
Packit Service |
f629e6 |
formats["0x%x"] = "non-decimal"
|
|
Packit Service |
f629e6 |
|
|
Packit Service |
f629e6 |
check(0,"0")
|
|
Packit Service |
f629e6 |
limit = HUGEVAL / 10
|
|
Packit Service |
f629e6 |
value = 1
|
|
Packit Service |
f629e6 |
for (i = 0; ; i++) {
|
|
Packit Service |
f629e6 |
check(10^i,"10^"i)
|
|
Packit Service |
f629e6 |
check(-10^i,"-10^"i)
|
|
Packit Service |
f629e6 |
#[probably should test value against 10^i here]
|
|
Packit Service |
f629e6 |
if (value >= limit) break
|
|
Packit Service |
f629e6 |
value *= 10
|
|
Packit Service |
f629e6 |
}
|
|
Packit Service |
f629e6 |
limit = HUGEVAL / 2
|
|
Packit Service |
f629e6 |
value = 1
|
|
Packit Service |
f629e6 |
for (i = 0; ; i++) {
|
|
Packit Service |
f629e6 |
check(2^i,"2^"i)
|
|
Packit Service |
f629e6 |
check(-2^i,"-2^"i)
|
|
Packit Service |
f629e6 |
#[probably should test value against 2^i here]
|
|
Packit Service |
f629e6 |
if (value >= limit) break
|
|
Packit Service |
f629e6 |
value *= 2
|
|
Packit Service |
f629e6 |
}
|
|
Packit Service |
f629e6 |
|
|
Packit Service |
f629e6 |
check_cons("%d",10,1,9)
|
|
Packit Service |
f629e6 |
check_cons("%x",2,4,31)
|
|
Packit Service |
f629e6 |
check_cons("%o",2,3,31)
|
|
Packit Service |
f629e6 |
|
|
Packit Service |
f629e6 |
# make sure basic %d and %x are working properly
|
|
Packit Service |
f629e6 |
printf "%d %d %x\n",3.7,-3.7,23.7
|
|
Packit Service |
f629e6 |
|
|
Packit Service |
f629e6 |
# check another problem in gawk 3.1.5: precision over 30 crashes
|
|
Packit Service |
f629e6 |
printf "%.55d\n",1
|
|
Packit Service |
f629e6 |
}
|