亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区
Chinaunix
標(biāo)題:
[方向錯(cuò)了]awk 自定以函數(shù)返回值的問(wèn)題?
[打印本頁(yè)]
作者:
jils2013
時(shí)間:
2012-06-14 16:03
標(biāo)題:
[方向錯(cuò)了]awk 自定以函數(shù)返回值的問(wèn)題?
本帖最后由 jils2013 于 2012-06-15 11:12 編輯
應(yīng)該是sprintf()和類(lèi)型轉(zhuǎn)化的問(wèn)題
因?yàn)檗D(zhuǎn)化類(lèi)型為d,所以按照數(shù)字來(lái)處理;--我猜可能是處理的數(shù)字大小限制(或者長(zhǎng)度限制)
改轉(zhuǎn)化類(lèi)型為s,即可避免開(kāi)始的問(wèn)題
以下是幾個(gè)簡(jiǎn)化的測(cè)試
[root@localhost ~]# echo "" | awk '{print sprintf("%020s","100111101010111111");}'
00100111101010111111
[root@localhost ~]# echo "" | awk '{print sprintf("%020d","100111101010111111");}'
00100111101010111104
[root@localhost ~]# echo "" | awk '{print sprintf("%020d","10011110101011111111");}'
10011110101011111936
[root@localhost ~]# echo "" | awk '{print sprintf("%020s","10011110101011111111");}'
10011110101011111111
[root@localhost ~]# echo "" | awk '{print sprintf("%030d","100111101010111111110");}'
00000000000000000001.00111e+20
[root@localhost ~]# echo "" | awk '{print sprintf("%030s","100111101010111111110");}'
000000000100111101010111111110
復(fù)制代碼
最開(kāi)始問(wèn)題的改進(jìn)后
[root@localhost ~]# echo "" | awk 'function binary(num)
{str="";while(num!=0){str=num%2str;num=int(num/2);};return sprintf("%02s",str)}
END\
{print binary(1624958878)}'
1100000110110101110011110011110
[root@localhost ~]# echo "" | awk 'function binary(num)
{str="";while(num!=0){str=num%2str;num=int(num/2);};return sprintf("%02s",str)}
END\
{print binary(162495)}'
100111101010111111
復(fù)制代碼
所以,問(wèn)題的結(jié)論個(gè)人認(rèn)為應(yīng)該是awk處理數(shù)字的精度問(wèn)題,這也可以解釋?zhuān)铋_(kāi)始的問(wèn)題:處理小數(shù)字沒(méi)有問(wèn)題,處理大數(shù)字時(shí)缺出現(xiàn)問(wèn)題;
sprintf()d的解釋?zhuān)?br /> d, i 接受整數(shù)值并將它轉(zhuǎn)換為有符號(hào)的十進(jìn)制符號(hào)表示法。精度指定顯示的最小數(shù)字位數(shù)。如果值轉(zhuǎn)換后可以用更少的位數(shù)來(lái)表示,將使用前導(dǎo)零擴(kuò)展。缺省精度是 1。精度為零的零值轉(zhuǎn)換的結(jié)果是空字符串。用零作為前導(dǎo)字符來(lái)指定字段寬度,導(dǎo)致用前導(dǎo)零填充字段寬度值。
也就是說(shuō),我們把一個(gè)2進(jìn)制20多位的數(shù)字字符串傳遞給sprintf時(shí),他會(huì)按照這個(gè)數(shù)字時(shí)十進(jìn)制去處理,應(yīng)該是很大的數(shù)字了
-- 開(kāi)始的問(wèn)題
前幾天用 awk 的 一個(gè)十進(jìn)制和二進(jìn)制轉(zhuǎn)換的自定以的函數(shù),較小的數(shù)字沒(méi)有問(wèn)題;
數(shù)字大點(diǎn)的,就會(huì)莫名其妙的打印問(wèn)題:用print 加變量可以正常打印,但是如果直接print 加上函數(shù)執(zhí)行 打印的數(shù)字和正常的小一點(diǎn);
平臺(tái)是rhel 5.4
[root@localhost shell]# awk --version
GNU Awk 3.1.5
[root@localhost shell]# echo "" | awk 'function binary(num)
{str="";while(num!=0){str=num%2str;num=int(num/2);};return sprintf("%0d",str)}
END\
{binary(162495);print str}'
100111101010111111
[root@localhost shell]# echo "" | awk 'function binary(num)
{str="";while(num!=0){str=num%2str;num=int(num/2);};return sprintf("%0d",str)}
END\
{print binary(162495)}'
100111101010111104
[root@localhost shell]# echo "" | awk 'function binary(num)
{str="";while(num!=0){str=num%2str;num=int(num/2);};return sprintf("%0d",str)}
END\
{print binary(16249)}'
11111101111001
復(fù)制代碼
作者:
ziyunfei
時(shí)間:
2012-06-15 00:01
直接 return str
且
function binary(num,str)
str必須成為局部變量,否則污染全局變量
作者:
jils2013
時(shí)間:
2012-06-15 09:02
悲劇了?求解救
作者:
jason680
時(shí)間:
2012-06-15 09:06
本帖最后由 jason680 于 2012-06-15 09:32 編輯
回復(fù)
1#
jils2013
return str
---------------------------------
$ echo
"0"
| awk 'function bin(n){s="";
do
{s=n%2""s;n=int(n/2)}
while(n>0);
return s}{print bin($1)}'
0
$ echo "1" | awk 'function bin(n){s="";do{s=n%2""s;n=int(n/2)}while(n>0);return s}{print bin($1)}'
1
$ echo "16249500" | awk 'function bin(n){s="";do{s=n%2""s;n=int(n/2)}while(n>0);return s}{print bin($1)}'
111101111111001010011100
歡迎光臨 Chinaunix (http://www.72891.cn/)
Powered by Discuz! X3.2