亚洲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è)試
  1. [root@localhost ~]# echo "" | awk '{print sprintf("%020s","100111101010111111");}'
  2. 00100111101010111111
  3. [root@localhost ~]# echo "" | awk '{print sprintf("%020d","100111101010111111");}'
  4. 00100111101010111104
  5. [root@localhost ~]# echo "" | awk '{print sprintf("%020d","10011110101011111111");}'
  6. 10011110101011111936
  7. [root@localhost ~]# echo "" | awk '{print sprintf("%020s","10011110101011111111");}'
  8. 10011110101011111111
  9. [root@localhost ~]# echo "" | awk '{print sprintf("%030d","100111101010111111110");}'
  10. 00000000000000000001.00111e+20
  11. [root@localhost ~]# echo "" | awk '{print sprintf("%030s","100111101010111111110");}'
  12. 000000000100111101010111111110
復(fù)制代碼
最開(kāi)始問(wèn)題的改進(jìn)后
  1. [root@localhost ~]# echo "" | awk 'function binary(num)
  2.                       {str="";while(num!=0){str=num%2str;num=int(num/2);};return sprintf("%02s",str)}
  3.                     END\
  4.                       {print binary(1624958878)}'  
  5. 1100000110110101110011110011110
  6. [root@localhost ~]# echo "" | awk 'function binary(num)                        
  7.                       {str="";while(num!=0){str=num%2str;num=int(num/2);};return sprintf("%02s",str)}
  8.                     END\
  9.                       {print binary(162495)}'  
  10. 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
  1. [root@localhost shell]# awk --version
  2. GNU Awk 3.1.5
  3. [root@localhost shell]# echo "" | awk 'function binary(num)
  4.                       {str="";while(num!=0){str=num%2str;num=int(num/2);};return sprintf("%0d",str)}
  5.                     END\
  6.                       {binary(162495);print str}'   
  7. 100111101010111111
  8. [root@localhost shell]# echo "" | awk 'function binary(num)
  9.                       {str="";while(num!=0){str=num%2str;num=int(num/2);};return sprintf("%0d",str)}
  10.                     END\
  11.                       {print binary(162495)}'
  12. 100111101010111104
  13. [root@localhost shell]# echo "" | awk 'function binary(num)
  14.                       {str="";while(num!=0){str=num%2str;num=int(num/2);};return sprintf("%0d",str)}
  15.                     END\
  16.                       {print binary(16249)}'
  17. 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